[HAOI2008]移动玩具
这又是一道神奇的搜索题。。。只要记录每种状态。。。然后暴力判断这种状态往后一步的情况。。。
广搜出最优解即可。。。
呆码:
#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()); }