1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
#include<bits/stdc++.h> using namespace std; int ans[4][4]= { {0,0,0,0}, {0,1,2,3}, {0,8,0,4}, {0,7,6,5} }; int a[4][4]; bool found=0; int dx[]={1,0,0,-1},dy[]={0,-1,1,0},k; bool same() { for(int i=1;i<4;i++) for(int j=1;j<4;j++) if(a[i][j]!=ans[i][j]) return 0; return 1; } bool check(int step) { int cnt=0; for(int i=1;i<4;i++) for(int j=1;j<4;j++) if(a[i][j]!=ans[i][j]) { if(++cnt+step>k) return 0; } return 1; } void A_star(int x,int y,int step,int pre) { if(step==k) { if(same())found=1; return ; } if(found)return ; for(int i=0;i<4;i++) { int nx=x+dx[i],ny=y+dy[i]; if(nx<1||ny<1||nx>3||ny>3||i+pre==3)continue; swap(a[x][y],a[nx][ny]); A_star(nx,ny,step+1,i); swap(a[x][y],a[nx][ny]); } } int main() { int sx,sy; string s; cin>>s; for(int i=0;i<9;i++) { a[i/3+1][i%3+1]=s[i]-'0'; if(s[i]=='0')sx=i/3+1,sy=i%3+1; } if(same()){puts("0");return 0;} while(++k) { A_star(sx,sy,0,-1); if(found) { cout<<k; return 0; } } }
|