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;
}

 

posted @ 2013-05-28 20:15  心向往之  阅读(182)  评论(0编辑  收藏  举报