hdu_2102 A计划

//普通广搜,两个传送门相对着那么骑士陷入循环困境(没考虑到)其次就是想法和代码实现的差距
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[20][20][3];
int book[20][20][3];//+层数标记
struct f{
    int x,y,li,step;
}b[20*20*4];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m,ti;
        scanf("%d%d%d",&n,&m,&ti);getchar();//各种吃回车
       int startx,starty,startli,endx,endy,endli;
        for(int i=1;i<=2;i++){
         for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=m;k++)
            {
              scanf("%c",&a[j][k][i]);
              if(a[j][k][i]=='S'){startx=j,starty=k,startli=i;}
              if(a[j][k][i]=='P'){endx=j,endy=k,endli=i;}
            }
            getchar();
        }
         if(i==1) getchar();
        }
       memset(book,0,sizeof(book));//注意初始化
       int head=0,tail=1,flag=0;//初始化
       b[head].x=startx,b[head].y=starty,b[head].li=startli,b[head].step=0,book[startx][starty][startli]=1;//初始化
       if(startx==endx&&starty==endy&&startli==endli){cout<<"YES"<<endl;continue;}//初始化
       while(head<tail){
          if(a[b[head].x][b[head].y][b[head].li]=='#'&&b[head].li==1){
                    b[head].li=2;
                  book[b[head].x][b[head].y][b[head].li]=1;
             if(a[b[head].x][b[head].y][b[head].li]=='*'||a[b[head].x][b[head].y][b[head].li]=='#') {head++;continue;}//注意head++;
             if(b[head].x==endx&&b[head].y==endy&&b[head].li==endli){flag=1;tail=head+1;break;}//在for循环前,注意flag,tail的变化,代码和想法的‘误差’
             }
             if(a[b[head].x][b[head].y][b[head].li]=='#'&&b[head].li==2){
                   b[head].li=1;
                 book[b[head].x][b[head].y][b[head].li]=1;
                 if(a[b[head].x][b[head].y][b[head].li]=='*'||a[b[head].x][b[head].y][b[head].li]=='#') {head++;continue;}
                 if(b[head].x==endx&&b[head].y==endy&&b[head].li==endli){flag=1;tail=head+1;break;}//tail=head+1;-wr
             }
        int next[4][3]={{0,1,0},{1,0,0},{0,-1,0},{-1,0,0}};//方向改成二维的即可(不改了,开始做时没审清题意关键)
        for(int i=0;i<4;i++)
        {
             int tx=b[head].x+next[i][0],ty=b[head].y+next[i][1],tli=b[head].li+next[i][2];
             if(tx<1||tx>n||ty<1||ty>m||tli<1||tli>2) continue;
             if(a[tx][ty][tli]=='*'||book[tx][ty][tli]) continue;
             book[tx][ty][tli]=1;
             b[tail].x=tx,b[tail].y=ty,b[tail].li=tli,b[tail++].step=b[head].step+1;
             if(tx==endx&&ty==endy&&tli==endli){flag=1;break;}
        }
        if(flag) break;
        head++;
       }
      if(flag&&b[tail-1].step<=ti){cout<<"YES"<<endl;}
      else {cout<<"NO"<<endl;}
    }
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值