题目网址:https://www.luogu.org/problemnew/show/P4289
当看到只有0,1并且棋盘大小为4*4时,直接想到bfs+状态压缩
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 inline long long read() 9 { 10 long long f=1,ans=0;char c; 11 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 12 while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} 13 return ans*f; 14 } 15 long long book[121220]; 16 struct node{ 17 long long a[5][5]; 18 long long minn; 19 long long getkey() 20 { 21 long long sum=0,f=1; 22 for(long long i=1;i<=4;i++) 23 { 24 for(long long j=1;j<=4;j++) 25 { 26 // long long ans=0; 27 // for(long long z=(i-1)*4+j;z<=16;z++) 28 // { 29 // if(z%4==0) 30 // if(a[(z+3)/4][4]==1) ans++; 31 // if(a[(z+3)/4][z%4]==1) ans++; 32 // } 33 // sum+=ans*f; 34 // f=f*2; 35 sum+=a[i][j]*f; 36 f*=2; 37 } 38 } 39 return sum; 40 } 41 }; 42 long long p[5][5]; 43 long long dx[4]={1,-1,0,0}; 44 long long dy[4]={0,0,1,-1}; 45 char str; 46 int main() 47 { 48 // freopen("game.in","r",stdin); 49 // freopen("game.out","w",stdout); 50 node ss; 51 for(long long i=1;i<=4;i++) 52 for(long long j=1;j<=4;j++) 53 { 54 cin>>str; 55 ss.a[i][j]=str-'0'; 56 } 57 ss.minn=0; 58 node bz; 59 for(long long i=1;i<=4;i++) 60 for(long long j=1;j<=4;j++) 61 { 62 cin>>str; 63 bz.a[i][j]=str-'0'; 64 } 65 long long check=bz.getkey(); 66 queue<node> que; 67 que.push(ss); 68 // cout<<ss.getkey()<<" "<<bz.getkey(); 69 while(!que.empty()) 70 { 71 node sry=que.front();que.pop(); 72 // cout<<sry.getkey()<<endl; 73 // for(long long i=1;i<=4;i++) 74 // { 75 // for(long long j=1;j<=4;j++) cout<<sry.a[i][j]; 76 // cout<<endl; 77 // } 78 // system("pause"); 79 80 if(sry.getkey()==check) 81 { 82 cout<<sry.minn;return 0; 83 } 84 if(book[sry.getkey()]==0) 85 { 86 // cout<<endl<<endl; 87 // for(long long i=1;i<=4;i++) 88 // { 89 // for(long long j=1;j<=4;j++) cout<<sry.a[i][j]; 90 // cout<<endl; 91 // } 92 // system("pause"); 93 book[sry.getkey()]=1; 94 for(long long i=1;i<=4;i++) 95 { 96 for(long long j=1;j<=4;j++) 97 { 98 for(long long k=0;k<4;k++) 99 { 100 long long xx=i+dx[k],yy=j+dy[k]; 101 // cout<<i<<" "<<j<<" "<<xx<<" "<<yy<<endl; 102 if(xx>=1&&xx<=4&&yy>=1&&yy<=4) 103 { 104 node sss=sry; 105 swap(sss.a[i][j],sss.a[xx][yy]); 106 sss.minn=sry.minn+1; 107 que.push(sss); 108 } 109 } 110 } 111 } 112 } 113 114 } 115 return 0; 116 }