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两种写法 [搜索]的更多相关文章

  1. hdu 2102 A计划(双层BFS)(具体解释)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...

  2. HDU 2102 A计划【三维BFS】

    A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  3. HDU 2102 A计划(DFS)

    题目链接 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主 ...

  4. HDU - 2102 A计划(双层BFS)

    题目: 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚, ...

  5. POJ 1979 dfs和bfs两种解法

      fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...

  6. KingbaseES 两表关联Update的两种写法与性能

    熟悉oracle 的人都知道,对于两表的关联更新,其执行计划主要有 Filter 和 Outer Join 两种方式.对于大批量数据的update,Join方式明显是更优的选择.KingbaseES ...

  7. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  8. EF架构~linq模拟left join的两种写法,性能差之千里!

    回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...

  9. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

随机推荐

  1. 25-1 request模块介绍

    requests模块 - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能 ...

  2. IDEA使用中文api鼠标提示的设置

    最近都在用IDEA来练习,发现有的方面确实比eclipse好用,eclipse里面可添加中文的API 提示,对初期的我帮助很大,但是IDEA却没有找到添加的地方,一直以来还以为不支持这个功能,比较遗憾 ...

  3. 基于 springMVC 的 RESTful HTTP API 实践(服务端)

    理解 REST REST(Representational State Transfer),中文翻译叫"表述性状态转移".是 Roy Thomas Fielding 在他2000年 ...

  4. oracle函数 INSTRB(C1,C2[,I[,J]])

    [功能]在一个字符串中搜索指定的字符,返回发现指定的字符的位置; [说明]多字节符(汉字.全角符等),按2个字符计算 [参数] C1    被搜索的字符串 C2    希望搜索的字符串 I     搜 ...

  5. Freeware Tools For Linux, http://www.debianhelp.co.uk/tools.htm

    Freeware Tools For Linux, http://www.debianhelp.co.uk/tools.htm Freeware Tools For Linux DNS related ...

  6. ODT模板

    struct node{ int l,r; mutable int v; node(int L,int R,int V):l(L),r(R),v(V){} inline bool operator & ...

  7. Refs

    一.The ref callback attribute ref:reference,父组件引用子组件 组件并不是真实的 DOM节点,而是存在于内存之中的一种数据结构,叫做虚拟DOM.只有当它插入文档 ...

  8. X-WAF 安装配置指南

    X-WAF 是一款方便易用的云WAF,使用反向代理的方式介入Web服务器和访问者之间,不需要像 modSecurity 和 Naxsin 那样作为nginx的模块,需要进行编译安装 X-WAF使用 O ...

  9. Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

    前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...

  10. C#的循环语句(一)

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变) {循环体} for 格式: for(int i=1/*初始条件*/;0<=10 ...