题意:

                                   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. [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)

    单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...

  2. CVE-2016-5734-phpmyadmin-4.0.x-4.6.2-代码执行

    参考 https://www.jianshu.com/p/8e44cb1b5b5b 漏洞原因 phpMyAdmin是一套开源的.基于Web的MySQL数据库管理工具.在其查找并替换字符串功能中,将用户 ...

  3. Java安全初学之反射

    前言: 复现fastjson的时候深深意识到了需要好好学习一下Java和Java安全,激情的学习了一番java安全中重要的几部分:反序列化.反射.rmi.动态代理,从反射开始做个总结. 反射:java ...

  4. 【odoo14】第八章、服务侧开发-进阶

    本章代码位于作为GITHUB库 https://github.com/PacktPublishing/Odoo-14-Development-Cookbook-Fourth-Edition 在第五章( ...

  5. 一款适用于windows10的反间谍工具

    Free antispy tool for Windows 10 前言 看标题的话,可能觉得"我要这款工具能干啥?",我刚开始也有这种疑惑,但后来我对于这款软件仔细想了想,这款还是 ...

  6. ACM常用的C++ && STL

    内容 c++输入输出 c++ string vector:不定长数组 map:映射 queue:队列 sort:排序 priority_queue:优先队列 c++输入输出 1 #include &l ...

  7. Min25筛求1-n内的素数和

    1 //#include <bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include< ...

  8. HDU(1420)Prepared for New Acmer(JAVA语言)【快速幂模板】

    思路:快速幂裸题. //注意用long,否则会超范围 Problem Description 集训进行了将近2个礼拜,这段时间以恢复性训练为主,我一直在密切关注大家的训练情况,目前为止,对大家的表现相 ...

  9. 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

    上一篇写的是使用静态基类方法的实现步骤:  http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...

  10. filesort排序原理

    在执行计划中,可能经常看到有Extra列有filesort,这就是使用了文件排序,这当然是不好的,应该优化,但是,了解一下他排序的原理也许很有帮助,下面看一下filesort的过程: 1.根据表的索引 ...