这个题目是关于BFS的一个应用,这题主要是两张地图,要逾越地图必须寻找“#‘,而且要判断对应的位置是否为’#‘或'*',坐标最好用三维数组,分别赋值就行了(因为只有2张)
对于位置的转移很方便。其他的就没什么大问题了.
#include<stdio.h> #include<string.h> struct node{ int x,y,z,t; }a[10000]; const int x_add[]={0,0,1,-1}; const int y_add[]={1,-1,0,0}; char map[2][1000][11]; int visit[2][1000][11]; int N,M,T,flag; int judg(int x,int y) { return(x>=0&&x<N&&y>=0&&y<M); } void BFS(int x,int y,int z) { memset(visit,0,sizeof(visit)); int rear=0,front=0; a[rear].x=x; a[rear].y=y; a[rear].z=z; a[rear++].t=0; while(rear>front) { int x=a[front].x,y=a[front].y,z=a[front++].z; for(int i=0;i<4;i++) { int xx=x+x_add[i],yy=y+y_add[i],zz=z; if(map[zz][xx][yy]=='#') { visit[zz][xx][yy]=1; if(zz==0&&map[zz+1][xx][yy]!='#'&&map[zz+1][xx][yy]!='*') zz++; if(zz==1&&map[zz-1][xx][yy]!='#'&&map[zz-1][xx][yy]!='*') zz--; } if(judg(xx,yy)&&(map[zz][xx][yy]=='.'||map[zz][xx][yy]=='P')&&visit[zz][xx][yy]==0) { visit[zz][xx][yy]=1; a[rear].x=xx; a[rear].y=yy; a[rear].z=zz; a[rear].t=a[front-1].t+1; if(map[zz][xx][yy]=='P') { if(a[rear].t<=T) flag=1; return; } rear++; } } } } int main() { int x1,y1,z1,n; scanf("%d",&n); while(n--) { flag=0; scanf("%d%d%d",&N,&M,&T); if(N>=1&&M<=10) { for(int i=0;i<N;i++) scanf("%s",&map[0][i]); for(int i=0;i<N;i++) scanf("%s",&map[1][i]); for(int i=0;i<2;i++) for(int j=0;j<N;j++) for(int k=0;k<M;k++) { if(map[i][j][k]=='S') { z1=i,x1=j,y1=k; goto loop; } } loop: BFS(x1,y1,z1); if(flag==1) printf("YES\n"); else printf("NO\n"); } } return 0; } /* 3 4 4 7 .*.P ...* .*.. #... ..#. ..*. #.S. ...* 5 5 15 S..#. .**.. .#... ..#.* *...# ...*. .#... *...# P*... ...*. */