hdu2102

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
struct node
{
    int x;
    int y;
    int z;
    int time;
};
int sx,sy,sz,ex,ey,ez,N,M,T,mark[3][100][100];
char s[3][100][100];
void BFS()
{
    queue<node>Q;
    node p,q;
    p.x=sx;
    p.y=sy;
    p.z=sz;
    p.time=0;
    mark[sz][sx][sy]=1;
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.front();
        Q.pop();
        if (q.time>T)
        break;
        if (q.time<=T&&q.x==ex&&q.y==ey&&q.z==ez)
        {
            printf ("YES\n");
            return;
        }
        int i;
        for (i=0;i<4;++i)
        {
            p=q;
            p.x+=dir[i][0];
            p.y+=dir[i][1];
            if (p.x>=1&&p.x<=N&&p.y>=1&&p.y<=M&&p.z>=1&&p.z<=2&&s[p.z][p.x][p.y]!='*'&&!mark[p.z][p.x][p.y])
            {
                mark[p.z][p.x][p.y]=1;
                //位置到达终点时也要加上时间,可根据题目点的测试案例可知
                if (s[p.z][p.x][p.y]=='.'||s[p.z][p.x][p.y]=='P')
                p.time=q.time+1;
                if (s[p.z][p.x][p.y]=='#')
                {
                    if (p.z==1)
                    p.z=2;
                    else
                    p.z=1;
                    p.time=q.time+1;
                    mark[p.z][p.x][p.y]=1;
                    //如果进入了时空穿梭机,那么两个位置都要标记
                }
                Q.push(p);
                //采用该行跟踪进入队列的数,以便可以调试,通过这样输出可得到
                //原来已入队的元素可能会再次入队,但没有影响结果
                //也可通过对时空穿梭机的对边进行判断,已阻止其入队
                cout<<p.x<<" "<<p.y<<" "<<p.z<<" "<<p.time<<endl;
            }
        }
    }
    printf ("NO\n");
}
int main()
{
    int k,i,j,l;
    cin>>k;
    while(k--)
    {
        cin>>N>>M>>T;
        for (l=1;l<=2;++l)
        for (i=1;i<=N;++i)
        for (j=1;j<=M;++j)
        {
            cin>>s[l][i][j];
            if (s[l][i][j]=='S')
            sx=i,sy=j,sz=l;
            if (s[l][i][j]=='P')
            ex=i,ey=j,ez=l;
            mark[l][i][j]=0;
        }
        l=1;
        for (i=1;i<=N;++i)
        for (j=1;j<=M;++j)
        {
            if (s[l][i][j]==s[l+1][i][j]&&s[l][i][j]=='#')
            s[l][i][j]=s[l+1][i][j]='*';
            if (s[l][i][j]=='*'&&s[l+1][i][j]=='#')
            s[l][i][j]=s[l+1][i][j]='*';
            if (s[l][i][j]=='#'&&s[l+1][i][j]=='*')
             s[l][i][j]=s[l+1][i][j]='*';
        }
        BFS();
    }
    return 0;
}

 

posted @ 2013-04-15 16:55  一线添  阅读(109)  评论(0编辑  收藏  举报