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. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. shared_ptr的线程安全性

    一: All member functions (including copy constructor and copy assignment) can be called by multiple t ...

  3. 1月北上广P2P平台之最 平台数成交量现双降

    1月北上广P2P平台之最 平台数成交量现双降   今日(2月9日),网贷之家联合盈灿咨询发布了<北上广地区P2P网贷行业2017年1月月报>.月报数据显示,截至2017年1月底,北京.上海 ...

  4. LeetCode63 Unique Paths II

    题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...

  5. H3C 对等通信

  6. IE下form表单密码输入框可以输入中文问题

    今天遇到了一个问题: 在IE浏览器登录界面,密码输入框,切换到中文输入法,竟然可以输入中文,已经设置过了input的type="password". 解决方法: 可以给input设 ...

  7. Element-ui学习笔记3--Form表单(二)

    Input输入框 Input 为受控组件,它总会显示 Vue 绑定值. 通常情况下,应当处理 input 事件,并更新组件的绑定值(或使用v-model).否则,输入框内显示的值将不会改变. 不支持  ...

  8. MongonDB指令汇总

    MongoDB特点使用不存在的对象,就等于你在创建这个对象(库,表,记录) MongoDB服务器/客户端相关 (记得把配置环境变量bin,MongonDB安装后bin在C盘的programfile-- ...

  9. php页面最大执行时间 set_time_limit函数不起作用

      作者: default|标签:PHP set_time_limit 执行时间|2017-3-21 15:03   set_time_limit 不生效或者无效解决方法 <?php globa ...

  10. gSOAP calc服务端与客户端示例

    1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...