HDOJ 2102 A计划 (BFS)

来源:互联网 发布:中韩贸易逆差数据 编辑:程序博客网 时间:2024/05/22 03:02

A计划

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
 

Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。
 

Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
 

Sample Input
15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..
 

Sample Output
YES
 
坑点:能够在T时刻”应该是“能够在T时刻内”,所以没必要奇偶减枝,步数减枝就可以了,如果‘#’另一侧是‘#’或‘*’都不能走,bfs代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<set>#include<queue>#include<stack>#include<vector>#include<algorithm>using namespace std;                    //HDOJ 2102int N,M,T,si,sj,sf,pi,pj,pf,mst;int vis[3][11][11];char maz[3][11][11];int tpf[3][11][11];int va[10] = {0,0,1,-1};int vb[10] = {1,-1,0,0};bool success;int change(int f){    if(f==1)        return 2;    return 1;}struct point{    int pf;    int px;    int py;    int step;};bool check(point ppt){    if(ppt.px<1||ppt.px>N||ppt.py<1||ppt.py>M)        return false;    if(maz[ppt.pf][ppt.px][ppt.py]=='*' || vis[ppt.pf][ppt.px][ppt.py])        return false;    return true;}void bfs(){    int i;    point tp,tem;    queue<point> q;    tp.px = si;    tp.py = sj;    tp.pf = sf;    tp.step = 0;    q.push(tp);    vis[tp.pf][tp.px][tp.py] = 1;    while(!q.empty()){        tp = q.front();        q.pop();        if((abs(tp.px-pi)+abs(tp.py-pj)+tp.step)>mst)            continue;    //预期步数减枝        if(tp.pf==pf&&tp.px==pi&&tp.py==pj&&tp.step<=mst){            success = true;            return;        }        for(i=0;i<4;i++){            tem = tp;            tem.px = tp.px + va[i];            tem.py = tp.py + vb[i];            tem.step = tp.step + 1;            if(check(tem)){                if(maz[tem.pf][tem.px][tem.py]=='#'){                    tem.pf = change(tem.pf);    //换层                    if(!vis[tem.pf][tem.px][tem.py]){                        q.push(tem);                        vis[tem.pf][tem.px][tem.py] = 1;                    }                }else{                    q.push(tem);                    vis[tem.pf][tem.px][tem.py] = 1;                }            }        }    }}int main(){    int f,i,j,n,C;    while(scanf("%d",&C)==1){        while(C--){            scanf("%d%d%d",&N,&M,&mst);            for(f=1;f<=2;f++){                for(i=1;i<=N;i++){                    for(j=1;j<=M;j++){                        cin>>maz[f][i][j];                        if(maz[f][i][j]=='S'){                            sf = f;                            si = i;                            sj = j;                        }                        if(maz[f][i][j]=='P'){                            pf = f;                            pi = i;                            pj = j;                        }                    }                }            }            memset(vis,0,sizeof(vis));            for(i=1;i<=N;i++){      //对图进行预处理                for(j=1;j<=M;j++){                    if(maz[1][i][j]=='#'&&maz[2][i][j]=='#'){                        maz[1][i][j] = '*';                        maz[2][i][j] = '*';                    }else if(maz[1][i][j]=='#'&&maz[2][i][j]=='*'){                        maz[1][i][j] = '*';                    }else if(maz[2][i][j]=='#'&&maz[1][i][j]=='*'){                        maz[2][i][j] = '*';                    }                }            }            success = false;            bfs();            if(success)                printf("YES\n");            else                printf("NO\n");        }    }}/*Sample Input15 5 14S*#*..#........****....#...*.P#.*..***.....*.*.#..Sample OutputYES*/



原创粉丝点击