标签:bfs
4 6 3 *** *B* *B* *H* *H* *** 4 4 **** *BB* *HH* **** 4 4 **** *BH* *HB* **** 5 6 ****** *.BB** *.H*H* *..*.* ******
3 1 2 Sorry , sir , my poor program fails to get an answer.
#include<stdio.h> #include<iostream> #include<queue> #include<string.h> using namespace std; struct node { int x[2],y[2],b,h; }; char tmap[25][25]; int n,m,dir[4][2]={0,1,0,-1,1,0,-1,0},hx[2],hy[2]; int isOk(int x,int y) { if(x<0||x>=n||y<0||y>=m||tmap[x][y]=='*') return 0; return 1; } int bfs(int bx[],int by[]) { int time=0,flag=0; node p,tp; queue<node>q[2]; //vist1用于两个球相对位置走过的情况,vist2用于剩于一个球与剩于一个洞相对位置走过的情况 bool vist1[25][25][25][25]={0},vist2[25][25][25][25]={0}; vist1[bx[0]][by[0]][bx[1]][by[1]]=1; vist1[bx[1]][by[1]][bx[0]][by[0]]=1; p.x[0]=bx[0]; p.y[0]=by[0]; p.x[1]=bx[1]; p.y[1]=by[1]; p.b=2; p.h=2; q[0].push(p); while(!q[flag].empty()) { time++; while(!q[flag].empty()) { p=q[flag].front(); q[flag].pop(); for(int e=0;e<4;e++) { tp=p; tp.x[0]+=dir[e][0]; tp.y[0]+=dir[e][1]; tp.x[1]+=dir[e][0]; tp.y[1]+=dir[e][1]; if(tp.b==2) { if(!isOk(tp.x[0],tp.y[0])) //球0原地不动 tp.x[0]=p.x[0],tp.y[0]=p.y[0]; if(!isOk(tp.x[1],tp.y[1])) //球1原地不动 tp.x[1]=p.x[1],tp.y[1]=p.y[1]; if(tp.x[0]==tp.x[1]&&tp.y[0]==tp.y[1]) //两球位置一样 continue; if(vist1[tp.x[0]][tp.y[0]][tp.x[1]][tp.y[1]])//两球的相对位置存在过 continue; if(tmap[tp.x[0]][tp.y[0]]=='0'||tmap[tp.x[0]][tp.y[0]]=='1')//球0进洞 { tp.b=1; //还剩球1 if(tmap[tp.x[0]][tp.y[0]]=='0') tp.h=1; //还剩洞1 else tp.h=0; //还剩洞0 } if(tmap[tp.x[1]][tp.y[1]]=='0'||tmap[tp.x[1]][tp.y[1]]=='1')//球1进洞 { if(tp.b==1)//两球一起进洞 return time; tp.b=0; //还剩球0 if(tmap[tp.x[1]][tp.y[1]]=='0') tp.h=1; else tp.h=0; } if(tp.b!=2) //只进了一个球 { int b,h; b=tp.b; h=tp.h; vist2[tp.x[b]][tp.y[b]][hx[h]][hy[h]]=1; } vist1[tp.x[0]][tp.y[0]][tp.x[1]][tp.y[1]]=1; vist1[tp.x[1]][tp.y[1]][tp.x[0]][tp.y[0]]=1; } else { int x,y,b,h; b=tp.b; h=tp.h; x=tp.x[b]; y=tp.y[b]; if(!isOk(x,y)||vist2[x][y][hx[h]][hy[h]]) continue; if(x==hx[h]&&y==hy[h]) //剩下的球位进入剩下的洞 return time; vist2[x][y][hx[h]][hy[h]]=1; } q[flag^1].push(tp); } } flag^=1; } return 0; } int main() { int T,bk,hk,x[2],y[2]; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); bk=hk=0; for(int i=0;i<n;i++) { scanf("%s",tmap[i]); for(int j=0;j<m;j++) if(tmap[i][j]=='B') { x[bk]=i; y[bk]=j; tmap[i][j]='.'; bk++; } else if(tmap[i][j]=='H') { hx[hk]=i; hy[hk]=j; tmap[i][j]=hk+'0'; hk++; } } int ans=bfs(x,y); if(ans) printf("%d\n",ans); else printf("Sorry , sir , my poor program fails to get an answer.\n"); } }
标签:bfs
原文地址:http://blog.csdn.net/u010372095/article/details/42847821