poj 1077 bfs+康托展开(8数码问题)
2014-08-05 16:06
288 查看
题意:8数码问题
思路:bfs,用康托展开来标记判重。所谓康托展开就是将1~n!个整数与n的全排列一一对应起来的一种方法,一种排列的值为i表示这种排列的字典序为第i小。
思路:bfs,用康托展开来标记判重。所谓康托展开就是将1~n!个整数与n的全排列一一对应起来的一种方法,一种排列的值为i表示这种排列的字典序为第i小。
#include <stdio.h> #include <string.h> #define N 362880 int s[9]; int fact[9] = {40320,5040,720,120,24,6,2,1,1}; int ori[4][2] = {{0,-1},{-1,0},{0,1},{1,0}}; int flag ; struct queue{ int s[9],dig,flag,pre; }q ; int end; int contor(int s[9]){//康托展开 int i,j,res,temp; for(i = 0,res=0;i<8;i++){ for(j = i+1,temp=0;j<9;j++) if(s[j]<s[i]) temp++; res += temp * fact[i]; } return res; } int check(int x,int y){ if(x<0||y<0||x>2||y>2) return 0; return 1; } void print(i){ int j; if(i!=0){ print(q[i].pre); if(q[i].flag == 0) putchar('l'); else if(q[i].flag == 1) putchar('u'); else if(q[i].flag == 2) putchar('r'); else if(q[i].flag == 3) putchar('d'); } } int bfs(){ struct queue now; int i,j,front,rear,x,y,xx,yy,temp,t[9]; front = -1; rear = 0; while(front < rear){ now = q[++front]; x = now.dig/3; y = now.dig%3; for(i = 0;i<4;i++){ xx = x+ori[i][0]; yy = y+ori[i][1]; if(check(xx,yy)){ for(j = 0;j<9;j++) t[j] = now.s[j]; t[3*x+y] = t[3*xx+yy]; t[3*xx+yy] = 9; temp = contor(t); if(!flag[temp]){ flag[temp] = 1; q[++rear].dig = 3*xx+yy; for(j = 0;j<9;j++) q[rear].s[j] = t[j]; q[rear].pre = front; q[rear].flag = i; if(temp == end){ print(rear); return 1; } } } } } return 0; } int main(){ int i,j,k; char ch; freopen("a.txt","r",stdin); memset(flag,0,sizeof(flag)); end = 0; for(i = 0;i<9;i++){ while((ch = getchar()) && ch==' '); if(ch == 'x'){ s[i] = 9; q[0].dig = i; } else s[i] = ch - '0'; } i = contor(s); flag[i] = 1; for(i = 0;i<9;i++) q[0].s[i] = s[i]; if(!bfs()) printf("unsolvable"); putchar('\n'); return 0; }
相关文章推荐
- POJ 1077 Eight(BFS八数码问题)
- poj 1077 八数码(BFS+康托展开)
- HDU 1043 Eight(经典八数码问题)对比POJ 1077
- hdu 1043 /poj 1077 Eight(经典八数码问题,BFS+康托展开)
- poj 1077--Eight(八数码问题,BFS,A*,全排列的哈希)
- Poj 1077 Eight 八数码问题 (搜索)
- 八数码问题 poj 1077 康拓展开
- POJ 1077 Eight, 八数码问题
- 双向BFS解八数码问题: POJ 1077
- 搜索 ( 八数码问题详解:BFS,A*,IDA* )——Eight ( POJ 1077 )
- POJ 1077 Eight【八数码问题】
- POJ1077、HDU1043 Eight 八数码问题:双向BFS、A*
- POJ 1077 Eight 八数码问题 A*
- POJ1077(经典的八数码问题)
- bfs+hash poj 1077/hdu 1043 八数码问题
- POJ 1077 Eight A*算法 八数码问题
- 八数码问题 IDA*算法+曼哈顿距离 poj 1077
- hdu 1034 & poj 1077 Eight 传说中的八数码问题。真是一道神题,A*算法+康托展开
- 【hdu1043 && poj 1077】八数码问题
- poj 1077 Eight 八数码问题( 康拓展开+BFS状态压缩)