• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yongchaoD

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

hdoj2102 -- A计划 (三维迷宫bfs)

题意:就是正常的bfs迷宫,增添了一层中有传送点'#',可以传送到另一层,这个题一共就两层迷宫,问能不能T步内到达终点。
思路:肯定是开三维数组,特别注意:mp[层][行][列]。这个题思路很清楚,就是要想到怎么写才简洁,代码量越少,越不容易出错,越容易调试。
“最开始我搓一大坨,开了两个if判断两层,重复很多代码”。只在进队列前,判断下下一点是不是传送点'#',是则改变下层数性质,注意传送后的点不能是墙'*'和又是传送点'#'。
只要是bfs迷宫,肯定会用到两个临时的结构体变量,一个取队列头,一个用于改变队列头的下一步(4个方向)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=15;
char mp[2][N][N];
int vis[2][N][N];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

int n,m,t;

struct Nod{
  int x,y,z,time;
}q,p;

void bfs(){
    memset(vis,0,sizeof(vis));
    q.x=0,q.y=0,q.z=0,q.time=0;
     vis[0][0][0]=1;
     queue<Nod>Q;
      Q.push(q);

       while(!Q.empty()){
            q=Q.front();
             Q.pop();

             if(mp[q.z][q.x][q.y]=='P'&&q.time<=t){
                 while(!Q.empty()) Q.pop();
                  printf("YES\n");
                  return;
             }

              for(int i=0;i<4;i++){
                  p=q;
                  p.x+=dir[i][0];
                  p.y+=dir[i][1];
                   if(p.x>=0&&p.x<n && p.y>=0&&p.y<m && !vis[p.z][p.x][p.y] && mp[p.z][p.x][p.y]!='*' && p.time<t){
                       vis[p.z][p.x][p.y]=1;

                        if(mp[p.z][p.x][p.y]=='#'){
                            if(p.z==0) p.z=1;
                             else p.z=0;
                              vis[p.z][p.x][p.y]=1;
                               if(mp[p.z][p.x][p.y]=='*'||mp[p.z][p.x][p.y]=='#') continue;
                        }
                        p.time++;
                        Q.push(p);
                   }
              }
       }
        printf("NO\n");
}

void solve(){
    cin>>n>>m>>t;
     for(int i=0;i<2;i++){
         for(int j=0;j<n;j++){
             cin>>mp[i][j];
         }
     }

      bfs();
}

int main()
{
    int c;
     cin>>c;
      while(c--){
          solve();
      }
    return 0;
}

posted on 2024-07-10 10:41  yongchaoD  阅读(19)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3