HDU 2102 A计划 DFS与BFS两种写法 [搜索]
1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用'P'标记;迷宫内,'.'表示空地,'*'表示墙,特殊的,'#'表示时空传输机,走到这里就会被传输到另一层的相对位置;在迷宫内没走动一步耗时为1,最终求解是否能在T时刻解救到公主;
2.输入输出:第一行C表示C组数据,每一组内N,M,T给出的迷宫规模与时间,接着给出了双层迷宫的内容;若是能找到公主输出"YES",否则"NO";
3.分析:这里原题意判断是否能在T时刻找到,然而要是写搜索判断有没有"时刻为T且位置为P"的状态,会超时,所以直接判断能不能在T时刻之前就找到;
BFS版:求出到达P处的最短时间并判断是否小于T;DFS版:找到第一个"时刻小于T且位置为P的状态"就返回;
# include <iostream>
# include <cstdio>
# include <queue>
# include <cstring>
using namespace std;
const int maxn=;
int N,M,T;
int dx[]={,,-,};
int dy[]={-,,,};
char maze[][maxn][maxn];
int vis[][maxn][maxn];
struct Node
{
int l,x,y,t;
Node(){}
Node(int ll,int xx,int yy,int tt)
{
l=ll;
x=xx;
y=yy;
t=tt;
}
};
void Init()
{
scanf("%d%d%d",&N,&M,&T);
for(int i=;i<;i++)
for(int j=;j<N;j++)
scanf("%s",maze[i][j]);
memset(vis,,sizeof(vis));
}
void Solve()
{
int ans=-;
queue<Node> Q;
vis[][][]=;
Q.push(Node(,,,));
while(!Q.empty())
{
Node temp=Q.front();
Q.pop();
if(temp.t<=T&&maze[temp.l][temp.x][temp.y]=='P')
{
ans=;
break;
}
if(temp.t>T) break;
for(int i=;i<;i++)
{
int nx=temp.x+dx[i];
int ny=temp.y+dy[i];
if(nx>=&&ny>=&&nx<N&&ny<M&&maze[temp.l][nx][ny]!='*'&&!vis[temp.l][nx][ny])
{
if(maze[temp.l][nx][ny]!='#')//"."
{
vis[temp.l][nx][ny]=;
Q.push(Node(temp.l,nx,ny,temp.t+));
}
else//'#'
{
vis[temp.l][nx][ny]=vis[!temp.l][nx][ny]=;
if(maze[!temp.l][nx][ny]!='*'&&maze[!temp.l][nx][ny]!='#')
Q.push(Node(!temp.l,nx,ny,temp.t+));
}
}
}
}
if(ans>) printf("YES\n");
else printf("NO\n");
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int C;
scanf("%d",&C);
while(C--)
{
Init();
Solve();
}
return ;
}
# include <iostream>
# include <cstdio>
# include <cstring>
# include <cstdlib>
using namespace std;
const int MAXN=;
char Maze[][MAXN][MAXN];
int dx[]={,-,,};
int dy[]={,,,-};
int vis[][MAXN][MAXN];
int N,M,T,f;
void Init()
{
f=;
scanf("%d%d%d",&N,&M,&T);
for(int k=;k<;k++)
for(int i=;i<N;i++)
scanf("%s",Maze[k][i]);
memset(vis,,sizeof(vis));
}
void dfs(int k,int x,int y,int t)
{
if(f) return;
if(t<T&&Maze[k][x][y]=='P')
{
f=;
return;
}
if(t==T)
{
if(Maze[k][x][y]=='P')
f=;
return;
}
for(int i=;i<;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=&&ny>=&&nx<N&&ny<M&&Maze[k][nx][ny]!='*')
{
if(Maze[k][nx][ny]!='#'&&!vis[k][nx][ny])
{
vis[k][nx][ny]=;
dfs(k,nx,ny,t+);
vis[k][nx][ny]=;
}
else
{
if(Maze[!k][nx][ny]!='#'&&Maze[!k][nx][ny]!='*')
if(!vis[k][nx][ny]&&!vis[!k][nx][ny])
{
vis[!k][nx][ny]=vis[k][nx][ny]=;
dfs(!k,nx,ny,t+);
vis[!k][nx][ny]=vis[k][nx][ny]=;
}
}
}
}
}
void Solve()
{
dfs(,,,);
if(f) printf("YES\n");
else printf("NO\n");
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int C;
scanf("%d",&C);
while(C--)
{
Init();
Solve();
}
return ;
}
HDU 2102 A计划 DFS与BFS两种写法 [搜索]的更多相关文章
- hdu 2102 A计划(双层BFS)(具体解释)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...
- HDU 2102 A计划【三维BFS】
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- HDU 2102 A计划(DFS)
题目链接 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主 ...
- HDU - 2102 A计划(双层BFS)
题目: 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚, ...
- POJ 1979 dfs和bfs两种解法
fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...
- KingbaseES 两表关联Update的两种写法与性能
熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式.对于大批量数据的update,Join方式明显是更优的选择.KingbaseES ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- EF架构~linq模拟left join的两种写法,性能差之千里!
回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...
- 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。
比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...
随机推荐
- QT_OPENGL-------- 2.shader
用可编程管线绘制一个三角形 1.以上一节window为基准,进行绘制. 2.下载编译glew,并在.pro添加动态链接,并在头文件中引用. LIBS +=-L/usr/lib64 -lGLEW 可能根 ...
- jmeter响应代码为乱码
1.在请求的前面添加BeanShell PostProcessor 输入prev.setDataEncoding("UTF-8"); 2.当响应数据或响应页面没有设置编码时,jme ...
- HDU-2859_Phalanx
Phalanx Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- mapping数据列表
- Data Flow-File Read-网络距离
- laravel 5.5 登录验证码 captcha 引入
https://blog.csdn.net/u013372487/article/details/79461730 前提: 开启Laravel 的用户认证功能 1.安装 Captcha 安装 Capt ...
- sspanel 常用审计规则
规则 禁用 BT 防止版权争议 BitTorrent protocol 数据包明文匹配 禁止 百度高精度定位 防止IP与客户端地理位置被记录 (api|ps|sv|offnavi|newvector| ...
- 在VirtualBox下安装linux操作系统
目标:在linux服务器上部署Java开发的网站 工具 VirtualBox-4.3.8:下载后安装. linux系统镜像: Centos国内镜像文件下载地址: http://centos.ustc. ...
- 2019-8-31-PowerShell-通过-WMI-获取系统服务
title author date CreateTime categories PowerShell 通过 WMI 获取系统服务 lindexi 2019-08-31 16:55:58 +0800 2 ...
- 【codeforces 777E】Hanoi Factory
[题目链接]:http://codeforces.com/problemset/problem/777/E [题意] 让你摆汉诺塔片; 要求在上面的片的外圈大于在下面的片的内圈,且小于下面的片的外圈; ...