A计划

来源:互联网 发布:数据交换设备有哪些 编辑:程序博客网 时间:2024/04/28 15:53

A计划

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 8   Accepted Submission(s) : 3

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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

//题意很简单,救公主,然后地图上有传送门,石头,起点,终点。用结构体做出包含有x,y,k,step的点,减掉传送门开启时对面不能是传送门和石头,石头就会被撞死,传送门就会永远传送。然后就可以压入开始的队列点,步数一定是要小于或者等于t的

#include <iostream>#include <cstdio>#include <queue>#include <cstring>#define N 15using namespace std;int vist[2][N][N];char map[2][N][N];int m,n,t;int dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};struct node{    int x,y;    int step;    int k;};int check(int k,int x,int y){    if(x>=0&&x<n&&y>=0&&y<m&&map[k][x][y]!='*')        return 1;    return 0;}void bfs(node s1,node s2,int time){    node st,ed;    queue<node>q;    int i;    memset(vist,0,sizeof(vist));    st.k=s1.k,st.x=s1.x,st.y=s1.y,st.step=0;    vist[st.k][st.x][st.y]=1;    q.push(st);    while(!q.empty())    {        st=q.front();        q.pop();        if(st.k==s2.k&&st.x==s2.x&&st.y==s2.y&&st.step<=t)        {            printf("YES\n");            return;        }        if(st.step>t)        {            printf("NO\n");            return;        }        for(i=0; i<4; i++)        {            ed.k=st.k;            ed.x=st.x+dir[i][0];            ed.y=st.y+dir[i][1];            if(!vist[ed.k][ed.x][ed.y]&&check(ed.k,ed.x,ed.y))            {                if(map[ed.k][ed.x][ed.y]=='#')                {                    if(ed.k==0)                        ed.k=1;                    else                        ed.k=0; //  时空机                    if(map[ed.k][ed.x][ed.y]=='*'||map[ed.k][ed.x][ed.y]=='#')//不仅不能传过去是石头,还不能是传送门                        continue;                }                vist[ed.k][ed.x][ed.y]=1;                ed.step=st.step+1;                q.push(ed);            }        }    }    printf("NO\n");}int main(){    int c;    int i,j,k;    node s1,s2;    scanf("%d",&c);    while(c--)    {        scanf("%d%d%d",&n,&m,&t);        for(k=0; k<2; k++)        {            for(i=0; i<n; i++)            {                scanf("%s",map[k][i]);            }        }        for(k=0; k<2; k++)            for(i=0; i<n; i++)                for(j=0; j<m; j++)                {                    if(map[k][i][j]=='S')                    {                        s1.x=i;                        s1.y=j;                        s1.k=k;                    }                    else if(map[k][i][j]=='P')                    {                        s2.k=k;                        s2.x=i;                        s2.y=j;                    }                }        bfs(s1,s2,t);    }    return 0;}


0 0