康托展开+bfs-2
2017-03-05 14:06
169 查看
#include<bits/stdc++.h> using namespace std; const int N=3628800; char str[12],goal[12]; int book[N+1000]; int f[10]; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int maps[4][4]; void init() { f[0]=1; for(int i=1;i<10;i++) f[i]=f[i-1]*i; } struct nodes { int p[3][3]; int x,y,step; }node[N/10+1000]; int cantor(int s[]) { int ans=0; for(int i=0;i<9;i++) { int num=0; for(int j=i+1;j<9;j++) { if(s[i]>s[j]) num++; } ans+=num*f[9-i-1]; } return ans; } int bfs(int startx,int starty,int c,int endc) { int head=0,tail=1; node[head].x=startx,node[head].y=starty,node[head].step=0,book[c]=1; for(int i=0;i<3;i++) for(int j=0;j<3;j++) node[head].p[i][j]=maps[i][j]; if(c==endc) return 0; while(head<tail) { for(int i=0;i<4;i++) { int x=node[head].x,y=node[head].y; int tx=x+next[i][0],ty=y+next[i][1]; if(tx<0||tx>=3||ty<0||ty>=3) continue; int temp=node[head].p[x][y]; node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp; int ss[12],l=0; for(int j=0;j<3;j++) for(int k=0;k<3;k++) ss[l++]=node[head].p[j][k]; int temp1=cantor(ss); if(book[temp1]) { int temp=node[head].p[x][y]; node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp; continue; } if(temp1==endc) return node[head].step+1; book[temp1]=1; for(int i=0;i<3;i++) for(int j=0;j<3;j++) node[tail].p[i][j]=node[head].p[i][j]; node[tail].x=tx,node[tail].y=ty,node[tail++].step=node[head].step+1; temp=node[head].p[x][y]; node[head].p[x][y]=node[head].p[tx][ty];node[head].p[tx][ty]=temp; } head++; } return -1; } int main() { init(); scanf("%s%s",str,goal); int k=0,startx,starty,endc,c; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { if(str[k]=='.'){startx=i,starty=j,k++;continue;} maps[i][j]=str[k++]-'0'; } int s[12]; for(int i=0;i<9;i++) { if(str[i]=='.') {s[i]=0;continue;} s[i]=str[i]-'0'; } c=cantor(s); for(int i=0;i<9;i++) { if(goal[i]=='.') {s[i]=0;continue;} s[i]=goal[i]-'0'; } endc=cantor(s); printf("%d\n",bfs(startx,starty,c,endc)); return 0; }九宫重排
相关文章推荐
- Aizu 0121 Seven Puzzle (康托展开+bfs)
- hdu1043Eight (经典的八数码)(康托展开+BFS)
- ACM-康托展开+预处理BFS之魔板——hdu1430
- bfs,hash,康托展开(UESTC 485,Game)
- UESTC 485 Game(康托展开,bfs打表)
- [HDOJ1043]Eight(康托展开 BFS 打表)
- hdu1043Eight (经典的八数码)(康托展开+BFS)
- 八数码问题的初次解决(康托展开+bfs)
- UESTC 485 Game(康托展开,bfs打表)
- HDU 1043 Eight(反向BFS打表+康托展开)
- POJ - 1077 Eight : 八数码 -- 哈唏 康托展开 双向bfs A* IDA*
- 2017ACM-ICPC南宁网络赛Frequent Subsets Problem(康托展开+bfs)
- HDU 1043 Eight (BFS·八数码·康托展开)
- 蓝桥杯 九宫格 基础bfs+康托展开
- hdu 5012 bfs 康托展开
- poj 1077(BFS预处理+康托展开)
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
- POJ 1077 八数码(康托展开+暴力bfs)
- HDU1043BFS 康托展开 八数码
- UESTC 485 Game(康托展开,bfs打表)