State space Search? Use a map to judge weight.
#include <cstdio>#include<algorithm>#include<cstring>#include<map>#include<queue>using namespacestd;intdx[]={1,0,-1,0},dy[]={0,1,0,-1};structStatus {inta[4][4]; Status Move (intXintYintdir) {Status res= * This; if(!a[x][y])return* This; intNx=x+dx[dir];intny=y+Dy[dir]; if(nx<0|| Nx>3|| ny<0|| Ny>3)return* This; if(A[nx][ny])return* This; Res.a[nx][ny]=1; res.a[x][y]=0; returnRes; } BOOL operator< (ConstStatus b)Const { for(intI=0;i<4; i++) for(intj=0;j<4; j + +)if(A[i][j]!=b.a[i][j])returna[i][j]<B.a[i][j]; return false; } BOOL operator==(ConstStatus b)Const { for(intI=0;i<4; i++) for(intj=0;j<4; j + +)if(A[i][j]!=b.a[i][j])return false; return true; } voidinit () {Chars[Ten]; for(intI=0;i<4; i++) {scanf ("%s",&s); for(intj=0;j<4; j + +) A[i][j]=s[j]-'0'; }}}next,cur,end;map<status,int>Dist;queue<Status>Q;intMain () {next.init (); End.init (); Dist.clear (); Dist[next]=1; Q.push (next); while(!Q.empty ()) {cur=Q.front (); Q.pop (); if(cur==end) { Break; } for(intI=0;i<4; i++) for(intj=0;j<4; j + +) for(intD=0;d <4;d + +) {Next=Cur.move (i,j,d); if(!Dist[next]) {Dist[next]=dist[cur]+1; Q.push (next); }}} printf ("%d\n", dist[end]-1); return 0; }
bzoj1054: [HAOI2008] Mobile toys