题意:

                                   A计划

Problem Description

可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

 

Input

输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

 

Output

如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

 

Sample Input

1

5 5 14

S*#*.

.#...

.....

****.

...#.

..*.P

#.*..

***..

...*.

*.#..

 

Sample Output

YES

思路:

      直接搜索就行了,一开始随意写了个,然后直接A了,A了之后突然感觉有问题,应该用优先队列,因为穿越的那个地方会让所有点不同步,然后写了个优先队列的,还是A了,后来自己想了想,应该是不用考虑优先队列,因为只有两层,自己模拟几组数据就明白了,但是在比赛的时候如果不确定,就最好写个优先队列,保险。


#include<stdio.h>
#include<string.h>
#include<queue> #define N 15

using namespace
std; typedef struct NODE
{
int
x ,y ,z ,t;
friend bool operator < (
NODE a ,NODE b)
{
return
a.t > b.t;
}
}
NODE; NODE xin ,tou;
int
mark[N][N][3];
int
map[N][N][3];
int
ex ,ey ,ez ,n ,m;
int
dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0}; bool ok(int x, int y ,int z)
{
if(
x >= 1 && x <= n && y >= 1 && y <= m && !mark[x][y][z] && map[x][y][z])
return
1;
return
0;
} int
BFS(int sx ,int sy ,int sz ,int xzt)
{

xin.x = sx ,xin.y = sy ,xin.z = sz ,xin.t = 0;
memset(mark ,0 ,sizeof(mark));
mark[xin.x][xin.y][xin.z] = 1;
priority_queue<NODE>q;
q.push(xin);
while(!
q.empty())
{

tou = q.top();
q.pop();
if(
tou.x == ex && tou.y == ey && tou.z == ez)
{
if(
tou.t <= xzt) return 1;
return
0;
}
if(
map[tou.x][tou.y][tou.z] == 2)
{
if(
map[tou.x][tou.y][tou.z^1] != 1 || mark[tou.x][tou.y][tou.z^1]) continue;
xin = tou;
xin.z ^= 1;
q.push(xin);
mark[tou.x][tou.y][tou.z^1] = 1;
continue;
} for(int
i = 0 ;i < 4 ;i ++)
{

xin.x = tou.x + dir[i][0];
xin.y = tou.y + dir[i][1];
xin.z = tou.z;
xin.t = tou.t + 1;
if(
ok(xin.x ,xin.y ,xin.z))
{

mark[xin.x][xin.y][xin.z] = 1;
q.push(xin);
}
}
}
return
0;
} int main ()
{
int
c ,t ,i ,j ,sx ,sy ,sz;
char
str[N];
scanf("%d" ,&c);
while(
c--)
{

scanf("%d %d %d" ,&n ,&m ,&t);
for(
i = 1 ;i <= n ;i ++)
{

scanf("%s" ,str);
for(
j = 0 ;j < m ;j ++)
{
if(
str[j] == 'S')
{

sx = i ,sy = j +1 ,sz = 0;
map[i][j + 1][0] = 1;
}
if(
str[j] == 'P')
{

ex = i ,ey = j + 1 ,ez = 0;
map[i][j+1][0] = 1;
}
if(
str[j] == '.') map[i][j+1][0] = 1;
if(
str[j] == '#') map[i][j+1][0] = 2;
if(
str[j] == '*') map[i][j+1][0] = 0;
}
} for(
i = 1 ;i <= n ;i ++)
{

scanf("%s" ,str);
for(
j = 0 ;j < m ;j ++)
{
if(
str[j] == 'S')
{

sx = i ,sy = j +1 ,sz = 1;
map[i][j + 1][1] = 1;
}
if(
str[j] == 'P')
{

ex = i ,ey = j + 1 ,ez = 1;
map[i][j+1][1] = 1;
}
if(
str[j] == '.') map[i][j+1][1] = 1;
if(
str[j] == '#') map[i][j+1][1] = 2;
if(
str[j] == '*') map[i][j+1][1] = 0;
}
} if(
BFS(sx ,sy ,sz ,t)) puts("YES");
else
puts("NO");
}
return
0;
}

hdu2102 水搜索的更多相关文章

  1. hdu5012 水搜索

    题意:       给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路:        ...

  2. P5198 [USACO19JAN]Icy Perimeter S (洛谷) (水搜索)

    同样是因为洛谷作业不会写…… 写(水)博客啦. 直接放题目吧,感觉放在代码框里好看点 Farmer John要开始他的冰激凌生意了!他制造了一台可以生产冰激凌球的机器,然而不幸的是形状不太规则,所以他 ...

  3. hdu1572 水搜索

    题意: 中文的不解释; 思路:           其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...

  4. hdu4771 水搜索(状态压缩+bfs)

    题意:      给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...

  5. hdu 5094 Maze(水搜索)

    题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...

  6. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A B 水 搜索

    A. Oath of the Night's Watch time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. hdu 2181 水搜索

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. hdu4536 水搜索

    题意: XCOM Enemy Unknown Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...

  9. Luogu P1141 01迷宫【搜索/dfs】By cellur925

    题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块. ...

随机推荐

  1. Typora的一些快捷键

      语法格式 快捷键 标题 # + 空格 = 一级标题, ## + 空格 =二级标题, 以此类推 shift + 数字1 =一级标题 ,shift + 数字2 =二级标题 , 以此类推 有序列表 1 ...

  2. linux软件deb打包及开机管理员自启动

    环境:Ubuntu 18.04/16.04  Qt:5.12.6 一 deb打包 1.建立目录结构 2.目录内容 1) 子目录DC520: Get以上内容步骤: (1)   创建目录DC520(自己软 ...

  3. Cookie与Session的安全性

    说到cookie与session我们首先要说一下为什么要引入这两个东西,这两个多西到底是干什么的 起源 由于HTTP协议使无状态的: 每一次请求都是新的请求,不会记得之前通信的状态 客户端与服务端的一 ...

  4. 4、Spring教程之Spring配置

    别名 alias 设置别名 , 为bean设置别名 , 可以设置多个别名 <!--设置别名:在获取Bean的时候可以使用别名获取--> <alias name="userT ...

  5. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

  6. java例题_14 该日期一年中的第几天问题

    1 /*14 [程序 14 求日期] 2 题目:输入某年某月某日,判断这一天是这一年的第几天? 3 程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情 ...

  7. thinkphp 5.1框架利用及rce分析

    前言 上个学期钻研web渗透的时候接触过几个tp的框架,但那时候还没有写blog的习惯,也没有记录下来,昨天在做ctf的时候正好碰到了一个tp的框架,想起来就复现一下 正文 进入网站,标准笑脸,老tp ...

  8. [树形DP]二叉苹果树

    二 叉 苹 果 树 二叉苹果树 二叉苹果树 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定 ...

  9. Mokito 单元测试与 Spring-Boot 集成测试

    Mokito 单元测试与 Spring-Boot 集成测试 版本说明 Java:1.8 JUnit:5.x Mokito:3.x H2:1.4.200 spring-boot-starter-test ...

  10. Vim快速使用教程

    Vim Vim是从vi发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富. Vi/Vim的使用 基本上分为三种模式,分别是命令模式(commad mode),输入模式(Inse ...