题目大意:把一个给出的01矩阵移动到目标矩阵,求最小步数
题解:由于数据小,随便bfs一下然后判重就好
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int n=4;
const int dx[]={0,-1,0,1,0};
const int dy[]={0,0,1,0,-1};
int st,ed,x,y;
int ans[n+5][n+5],vis[134145];
struct data{int a[n+5][n+5],s;}u,p;
queue<data> q;
bool ok(){return x<=4&&y<=4&&x>=1&&y>=1;}
int hash(int z[n+5][n+5])
{
int k=1,s=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
s+=k*z[i][j],k<<=1;
return s;
}
int bfs()
{
if(st==ed) return 0;
vis[st]=1;
while(!q.empty())
{
u=q.front();q.pop();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(u.a[i][j])
for(int k=1;k<=n;k++)
{
x=i+dx[k],y=j+dy[k];
if(u.a[x][y]||!ok()) continue;
swap(u.a[i][j],u.a[x][y]);
int t=hash(u.a);
if(!vis[t]){
if(t==ed) return u.s+1;
vis[t]=1;p=u,p.s=u.s+1;
q.push(p);
}
swap(u.a[i][j],u.a[x][y]);
}
}
}
void init()
{
char ch[n+5];
for(int i=1;i<=n;i++){
scanf("%s",ch+1);
for(int j=1;j<=n;j++)
u.a[i][j]=ch[j]-'0';//要循环加到u里……不能直接搞
}
for(int i=1;i<=n;i++){
scanf("%s",ch+1);
for(int j=1;j<=n;j++)
ans[i][j]=ch[j]-'0';
}
q.push(u);st=hash(u.a);ed=hash(ans);
cout<<bfs();
}
int main()
{
init();
return 0;
}