hdu2102 水搜索
题意:
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 水搜索的更多相关文章
- hdu5012 水搜索
题意: 给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下. 思路: ...
- P5198 [USACO19JAN]Icy Perimeter S (洛谷) (水搜索)
同样是因为洛谷作业不会写…… 写(水)博客啦. 直接放题目吧,感觉放在代码框里好看点 Farmer John要开始他的冰激凌生意了!他制造了一台可以生产冰激凌球的机器,然而不幸的是形状不太规则,所以他 ...
- hdu1572 水搜索
题意: 中文的不解释; 思路: 其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...
- hdu4771 水搜索(状态压缩+bfs)
题意: 给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间. 思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制 ...
- hdu 5094 Maze(水搜索)
题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...
- 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 ...
- hdu 2181 水搜索
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu4536 水搜索
题意: XCOM Enemy Unknown Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- Luogu P1141 01迷宫【搜索/dfs】By cellur925
题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块. ...
随机推荐
- Nebula Storage 2.0 存储格式
随着 2.0 各版本的陆续发布,Nebula Graph 迎来了一系列的改动,在存储方面,影响最大的改动就是底层编码格式进行了修改.Nebula Graph 的底层存储是基于 KV 保存在 Rocks ...
- Fcitx5 上线 FreeBSD
Fcitx5 上线 FreeBSD textproc/fcitx5textproc/fcitx5-qttextproc/fcitx5-gtktextproc/fcitx5-configtoolchin ...
- Codeforces Round #574 (Div. 2) E. OpenStreetMap 【单调队列】
一.题目 OpenStreetMap 二.分析 对于二维空间找区间最小值,那么一维的很多好用的都无法用了,这里可以用单调队列进行查找. 先固定一个坐标,然后进行一维的单调队列操作,维护一个区间长度为$ ...
- 有必要了解的大数据知识(一) Hadoop
前言 之前工作中,有接触到大数据的需求,虽然当时我们体系有专门的大数据部门,但是由于当时我们中台重构,整个体系的开发量巨大,共用一个大数据部门,人手已经忙不过来,没法办,为了赶时间,我自己负责的系统的 ...
- gstreamer常用命令
由于有好一段时间没做GStreamer相关项目了,早前的一些记录需要做下记录,以待需要的时候查阅. 还是分几个小节来介绍吧,这样思路清晰一点.(格式有点乱,没时间整理,读者自行脑补) 1. 播放视频. ...
- JAVA面试-计算机网络-TCP三次握手
学习原因 这个是面试的一个常问热点,所以务必要掌握. 通俗示例 小红是人事部门的员工,现在正在招收IT人员,小明看到招聘信息和待遇,感觉很适合自己,所以准备和小红发消息了解具体情况.而简历在本故事中代 ...
- InfluxDB、Grafana等开源软件的监控后门
在使用手机APP的过程中,用户信息会不知不觉的被APP悄无声息的收集到云端,然后进行各种用户行为分析以及智能推荐,这是众所周知但秘而不宣的事. 在使用开源软件时,也存在悄悄收集用户使用信息,并且上报到 ...
- 全网最详细的Linux命令系列-iptrad-ng网络流量监测命令
观察网络流量的工具:IPTRAF 想知道你的Linux系统上网络流量有多大吗?想知道是哪一块网卡承载着网络流量吗?想知道哪一个进程产生了网络流量吗?iptraf可以帮你做到.在最新的Linux rel ...
- java面试一日一题:讲对mysql的MVCC的理解
问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...
- Redis初学
1. redis 1. 概念 2. 下载安装 3. 命令操作 1. 数据结构 4. 持久化操作 5. 使用Java客户端操作redis Redi ...