HDU 2102 A计划 DFS与BFS两种写法 [搜索]
2024-09-06 16:29:21
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 ;
}
最新文章
- Elasticsearch初步使用(安装、Head配置、分词器配置)
- POJ 3071 Football(概率DP)
- DNSPod各个套餐的DNS地址
- Functions类,一个Javascript的函数加法类,将两个函数加起来,顺序执行
- linux 认证方式
- Oracle 课程二之Oracle数据库逻辑结构
- WindowsPhone8SDK重装后设计器加载异常的处理办法
- 极简易版专家聊天程序--JAVA练手
- Apache Commons工具集简介(转)
- pc端的企业网站(IT修真院test8)详解1-2
- 【css】圆角 +文本阴影
- 201521123024 《Java程序设计》第11周学习总结
- 【原创】大数据基础之Azkaban(1)简介、源代码解析
- 文本编辑器 EditPlus 的激活与设置
- 数据导入Excel时,出现ole error 800AC472这个错误,怎么解决。
- 获取img的高
- 读书笔记,《深入理解java虚拟机》,第三章 垃圾收集器与内存分配策略
- VS Code配置初探
- ucontext-人人都可以实现的简单协程库
- 复习原生ajax
热门文章
- 【数据库】sql2008卸载和默认实例的删除 标签: 数据库 2014-11-16 15:15 5878人阅读 评论(30)
- 在window.onload中使用setTimeout
- 【NS2】有线和无线混合场景 (转载)
- 域名拆分 tld
- 2017 ACM/ICPC Asia Regional Shenyang Online:number number number hdu 6198【矩阵快速幂】
- @atcoder - AGC035F@ Two Histograms
- 从零学React Native之01创建第一个程序
- epoll与fork
- @bzoj - 4381@ [POI2015] Odwiedziny
- iptables 防止DoS攻击