hdu 2102 A计划

21 篇文章 0 订阅
5 篇文章 0 订阅

题目   http://acm.hdu.edu.cn/showproblem.php?pid=2102

刚开始做这个题目时候呢    不会做  不知道怎么样下手   看了一下别人代码又觉得很容易哦

  在这里要注意二个地方     1. 当某个位置   第一层  第二层都是 # 时  要小心   就可以把它们当做是 * 一堵墙  呵呵

                                           2. 当某个位置    第一层是  #  第二层是 *  时   要注意   你可以把二个位置都当做  *  或者第一层是 * 第二层是  #   也一样哦。。

具体看代码  

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;

struct node{
 int x,y,z;
 int time;
};
int sx,sy,sz,ex,ey,ez,N,M,T,mark[3][12][12];   ///mark标记
char a[3][12][12];   ///记录
int dre[4][2]={{-1,0},{1,0},{0,-1},{0,1}};  ///上下左右

void DFS()
{
    queue<node>Q;   ///队列
    node d,p;
    d.x=sx;
    d.y=sy;
    d.z=sz;   ///公主位置
    d.time=0;   ///时间
    mark[sz][sx][sy]=1;
    Q.push(d);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        if(p.time>T) break;   ///超时
        if(p.time<=T&&p.x==ex&&p.y==ey&&p.z==ez)  ///是否是P点
        {
            cout<<"YES"<<endl;
            return ;
        }
        int i;
        for(i=0;i<4;i++)  ///上下左右
        {
            d=p;
            d.x+=dre[i][0];
            d.y+=dre[i][1];
            ///在这个数组里面
            if(d.x>=1&&d.x<=N&&d.y>=1&&d.y<=M&&d.z>=1&&d.z<=2&&a[d.z][d.x][d.y]!='*'&&!mark[d.z][d.x][d.y])
            {
                mark[d.z][d.x][d.y]=1;
                if(a[d.z][d.x][d.y]=='.'||a[d.z][d.x][d.y]=='P')  ///记录时间
                {
                    d.time+=1;
                }

                if(a[d.z][d.x][d.y]=='#')  ///是否可以转入另外一层
                {
                    if(d.z==1)
                    d.z=2;
                    else
                    d.z=1;
                    d.time+=1;
                     mark[d.z][d.x][d.y]=1;  ///标记点
                }
                Q.push(d);  ///把d放入Q中
            }
        }

    }
     cout<<"NO"<<endl;
}



int main()
{
    int c,i,j,k;
     scanf("%d",&c);
     while(c--)
     {
         scanf("%d %d %d",&N,&M,&T);
         for(k=1;k<=2;k++)
         for(i=1;i<=N;i++)
         for(j=1;j<=M;j++)
         {
            cin>>a[k][i][j];
            if(a[k][i][j]=='S')
            {
                sx=i,sy=j,sz=k;///记录公主位置
            }
            if(a[k][i][j]=='P')
            {
                ex=i,ey=j,ez=k;///出口
            }
           /// a[i][j][k]=
           mark[k][i][j]=0;  ///初始化
         }
         ///不能转的#  简化一下
         for(i=1;i<=N;i++)
         for(j=1;j<=M;j++)
         {
             if(a[1][i][j]==a[2][i][j]&&a[1][i][j]=='#')   ///如果第一层第二层都是#   就相当与*
             {
                 a[1][i][j]=a[2][i][j]='*';
             }
             if(a[1][i][j]=='#'&&a[2][i][j]=='*')  ///注意
             {
                 a[1][i][j]='*';
             }
              if(a[2][i][j]=='#'&&a[1][i][j]=='*')  ///同理
             {
                 a[2][i][j]='*';
             }
         }
      DFS();
     }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值