hdu 2102 广搜
题意:魔王将在T时刻吃掉公主,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。如果骑士们在T时刻能找到公主就输出“YES”,否则输出“NO”。
分析:简单广搜,
要注意的是,一旦进入传输机就被传送到另一层,不能在传输机上停留。
另外,若另一层的相对位置也是传输机,则不能传输,两个传输机都应视为墙。
int dx[] = {-1,0,1,0};//up Right down Left int dy[] = {0,1,0,-1}; const int N = 15, M = 1005; char c[2][N][N], ch; bool b[2][N][N]; int n, m, t; int z, x, y, d; int zz,xx,yy,dd; struct node{ int z, x, y, d; }E[M]; int h, r; void bfs(){ h = r = 0; b[x][y][z] = 1; E[h].z=z; E[h].x=x; E[h].y=y; E[h].d=0; h++; while( r < h ){ z=E[r].z; x=E[r].x; y=E[r].y; d=E[r].d; r++; if(d==t) continue;//超过时刻t FOR(i, 0, 4){//四个方向 xx = x+dx[i]; yy = y+dy[i]; dd = d+1; ch = c[z][xx][yy]; if(xx<0 || yy<0 || xx==n || yy==m) continue;//坐标越界 else if(ch=='P') { printf("YES\n"); return; }//找到公主 else if(ch=='*' || b[z][xx][yy]) continue;//墙或者之前走过 else if(ch=='.'){ E[h].z=z; E[h].x=xx; E[h].y=yy; E[h].d=dd; h++; b[z][xx][yy] = 1;}//入队 else {//时空机 zz = 1-z; ch = c[zz][xx][yy]; if(ch=='P') { printf("YES\n"); return; }//找到公主 else if(ch=='*' || ch=='#' ||b[z][xx][yy]) continue;//墙或者之前走过,或者传送到了时光机上 else { E[h].z=zz; E[h].x=xx; E[h].y=yy; E[h].d=dd; h++; b[zz][xx][yy] = 1; }//入队 } } } printf("NO\n"); } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); #endif int T; scanf("%d", &T); while(T--){ memset(b, 0, sizeof b); scanf("%d%d%d", &n, &m, &t); FOR(i, 0, 2) FOR(j, 0, n) { scanf("%s", c[i][j]); FOR(k, 0, m) if(c[i][j][k]=='S'){ z = i; x = j; y = k; } } bfs(); } return 0; }