搜索专题: HDU2102 A计划

news/2025/2/24 17:02:04

这不知道是公主被抓走了第几次了,反正我们的骑士救就对了(别说了,我都救我都救...);这次的迷宫有些特别,双层,带电梯(?),而且这个电梯还有生命危险,可能会撞死(一层是电梯,一层是墙),或者永远困在电梯里(上下两层都是电梯),而且上了电梯必须移动,我想到的是BFS,WA了一次,主要是这题的细节问题比较多,认真处理一下就好;

代码如下:

Problem : 2102 ( A计划 )     Judge Status : Accepted
RunId : 21313702    Language : C++    Author : hnustwanghe
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int N = 10 + 5; const int INF = (1<<30); char mat[2][N][N]; bool visit[2][N][N]; typedef struct node{ int x,y,z,val; node(int x=0,int y=0,int z=0,int val=0):x(x),y(y),z(z),val(val){} }Node; Node goal; int n,m,k; const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; bool BFS(){ queue<Node> Q; int ans = INF; Node t,s; Q.push(Node(0,0,0)); visit[0][0][0] = true; while(!Q.empty()){ t = Q.front();Q.pop(); if(t.x==goal.x && t.y == goal.y && t.z == goal.z && t.val<=k) { ans=min(ans,t.val);continue;} for(int d=0;d<4;d++){ int newx = t.x + dir[d][0]; int newy = t.y + dir[d][1]; if(newx >= 0 && newx < n && newy >=0 && newy < m && !visit[t.z][newx][newy] && mat[t.z][newx][newy]!='*'){ if(mat[t.z][newx][newy]=='#' && !visit[t.z^1][newx][newy]){ s.x =newx,s.y= newy ,s.val = t.val+1,s.z = t.z^1; visit[t.z^1][newx][newy] = visit[t.z][newx][newy] = true; Q.push(s); }else{ s.x = newx , s.y = newy,s.val = t.val+1,s.z = t.z; visit[t.z][newx][newy] = true; //if(t.val <= k) Q.push(s); } } } } return ans!=INF; } void solve_question(){ memset(visit,0,sizeof(visit)); for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(mat[0][i][j]=='*' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*'; if(mat[0][i][j]=='#' && mat[1][i][j]=='*') mat[0][i][j] = mat[1][i][j] = '*'; if(mat[0][i][j]=='#' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*'; } printf("%s\n",BFS()?"YES":"NO"); } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d %d %d",&n,&m,&k); for(int k=0;k<2;k++) for(int i=0;i<n;i++){ scanf("%s",mat[k][i]); for(int j=0;j<m;j++) if(mat[k][i][j]=='P') goal.x = i,goal.y = j,goal.z = k; } solve_question(); } return 0; }
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;
const int N = 10 + 5;
const int INF = (1<<30);
char mat[2][N][N];
bool visit[2][N][N];
typedef struct node{
    int x,y,z,val;
    node(int x=0,int y=0,int z=0,int val=0):x(x),y(y),z(z),val(val){}
}Node;
Node goal;
int n,m,k;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool BFS(){
    queue<Node> Q;
    int ans = INF;
    Node t,s;
    Q.push(Node(0,0,0));
    visit[0][0][0] = true;
    while(!Q.empty()){
        t = Q.front();Q.pop();
        if(t.x==goal.x && t.y == goal.y && t.z == goal.z && t.val<=k) { ans=min(ans,t.val);continue;}
        for(int d=0;d<4;d++){
            int newx = t.x + dir[d][0];
            int newy = t.y + dir[d][1];
            if(newx >= 0 && newx < n && newy >=0 && newy < m  && !visit[t.z][newx][newy] && mat[t.z][newx][newy]!='*'){
                if(mat[t.z][newx][newy]=='#' && !visit[t.z^1][newx][newy]){
                    s.x =newx,s.y= newy ,s.val = t.val+1,s.z = t.z^1;
                    visit[t.z^1][newx][newy] = visit[t.z][newx][newy] = true;
                    Q.push(s);
                }else{
                    s.x = newx , s.y = newy,s.val = t.val+1,s.z = t.z;
                    visit[t.z][newx][newy] = true;
                    //if(t.val <= k)
                    Q.push(s);
                }
            }
        }
    }
    return ans!=INF;
}
void solve_question(){
    memset(visit,0,sizeof(visit));
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++){
        if(mat[0][i][j]=='*' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
        if(mat[0][i][j]=='#' && mat[1][i][j]=='*') mat[0][i][j] = mat[1][i][j] = '*';
        if(mat[0][i][j]=='#' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
    }
    printf("%s\n",BFS()?"YES":"NO");
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d %d",&n,&m,&k);
        for(int k=0;k<2;k++)
        for(int i=0;i<n;i++){
            scanf("%s",mat[k][i]);
            for(int j=0;j<m;j++)
                if(mat[k][i][j]=='P') goal.x = i,goal.y = j,goal.z = k;
        }
        solve_question();
    }
    return 0;
}

转载于:https://www.cnblogs.com/Pretty9/p/7347721.html


http://www.niftyadmin.cn/n/712044.html

相关文章

MyBatis——谈谈占位符(#、$)的理解与使用

文章目录&#xff1a; 1.#占位符 1.1 #占位符的特点 1.2 使用 #{ } 对数据库执行 update 操作 2.$占位符 2.1 $占位符的特点 2.2 使用 ${ } 对数据库执行 select 操作 3.#{ }、${ } 占位符的综合使用 1.#占位符 1.1 #占位符的特点 MyBatis处理 #{ } 占位符&#x…

量化信噪比 非均匀量化_非均匀量化-Read.PPT

非均匀量化-Read03.11.20 第二章 数字通信技术-2 数字通信技术-1 主要内容 1、差错控制编码的基本思想。 2、PCM的三个基本过程。 3、抽样定理。 4、语音信号的抽样周期。 5、量化的基本思想。 6、均匀量化的弊端。 2.2.2 量化—非均匀量化 关于非均匀量化的主要内容&#xff1…

linux视频嗅探工具,Linux 5.13增加来自英特尔的KCPUID组件 帮助准确识别新推出的CPU...

原标题&#xff1a;Linux 5.13增加来自英特尔的KCPUID组件 帮助准确识别新推出的CPU 来源&#xff1a;cnBeta.COM今天上午&#xff0c;在新开放的Linux 5.13合并窗口的 "x86/misc "拉动请求中&#xff0c;增加了新的KCPUID实用工具。KCPUID是由英特尔添加到Linux内核…

C# System.IO.Path

Path的常用方法 函数列表 对一个路径做相应操作&#xff0c;包括文件路径&#xff0c;目录路径&#xff0c;通常会用到Path这个类&#xff0c; 本文列举一些常用的操作。 获取指定路径字符串的目录信息 public static string GetDirectoryName(string path) 直接看几个示例了&a…

理解代码的二进制级别重用

理解代码的二进制级别重用在软件开发中&#xff0c;经常提到源代码重用&#xff0c;Dll重用等概念&#xff0c;而代码的二进制级别重用则相对晦涩。本文将从软件发布的角度一步一步讲解二进制级别重用的内涵&#xff0c;希望对大家有帮助。需要说明的是&#xff0c;在行文过程中…

C#中几种单例模式

1.静态代码块 /// <summary>/// 静态代码块/// 仅在第一次调用类的任何成员时自动执行/// </summary>public class SingletonStatic{private static readonly SingletonStatic _instance null;static SingletonStatic(){_instance new SingletonStatic();}private…

MyBatis——封装MyBatis的输出结果(resultType、resultMap)、使用like进行模糊查询的两种方式

文章目录&#xff1a; 1.封装MyBatis的输出结果 1.1 第一种方式——使用resultType 1.2 resultType返回简单类型的数据 1.3 resultType返回对象类型的数据 1.4 resultType返回Map类型的数据 1.5 resultType默认规则&#xff08;同名的列赋值给同名的属性&#xff09; 1…

python 并行计算架构_python并行编程学习之并行计算存储体系结构

基于指令和可被同时处理的存储单元的数目&#xff0c;计算机系统可以分为以下四种类目&#xff1a;单指令&#xff0c;单数据单元(SISD)在该体系结构中&#xff0c;计算机是单处理器机器&#xff0c;一次只能用单一的指令来操作单一的数据流。在SISD中&#xff0c;机器指令按照…