这又是一道神奇的搜索题。。。只要记录每种状态。。。然后暴力判断这种状态往后一步的情况。。。
广搜出最优解即可。。。
呆码:
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std;int dx[5]={0,0,1,0,-1}; int dy[5]={0,1,0,-1,0}; int dis[100010]; char st[5]; bool use[100010];struct asd{int a[5][5],num;int sum() {int tot=0;for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)tot+=(a[i][j]<<4*(i-1)+j-1);return tot;}void read() {for(int i=1;i<=4;i++){scanf("%s",st);for(int j=1;j<=4;j++)a[i][j]=(st[j-1]=='1' ? 1 : 0);}num=sum();} }s,t;inline int BFS() {memset(dis,50,sizeof(dis));queue <asd> q;q.push(s); dis[s.num]=0; use[s.num]=1;while(!q.empty()){asd now=q.front(); q.pop();for(int x=1;x<=4;x++)for(int y=1;y<=4;y++)if(now.a[x][y])for(int i=1;i<=4;i++){int xx=x+dx[i];int yy=y+dy[i];if(xx>=1 && xx<=4 && yy>=1 && yy<=4 && !now.a[xx][yy]){swap(now.a[xx][yy],now.a[x][y]);asd u=now; u.num=u.sum();swap(now.a[xx][yy],now.a[x][y]);if(!use[u.num]){dis[u.num]=dis[now.num]+1;if(u.num==t.num) return dis[t.num];q.push(u); use[u.num]=1;}}}}return dis[t.num]; }int main() {s.read(); t.read();if(s.num==t.num) printf("0\n");else printf("%d\n",BFS()); }