搜索专题: HDU2102 A计划
这不知道是公主被抓走了第几次了,反正我们的骑士救就对了(别说了,我都救我都救...);这次的迷宫有些特别,双层,带电梯(?),而且这个电梯还有生命危险,可能会撞死(一层是电梯,一层是墙),或者永远困在电梯里(上下两层都是电梯),而且上了电梯必须移动,我想到的是BFS,WA了一次,主要是这题的细节问题比较多,认真处理一下就好;
代码如下:
|
|
RunId : 21313702 Language : C++ Author : hnustwanghe
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 10 + 5;
const int INF = (1<<30);
char mat[2][N][N];
bool visit[2][N][N];
typedef struct node{
int x,y,z,val;
node(int x=0,int y=0,int z=0,int val=0):x(x),y(y),z(z),val(val){}
}Node;
Node goal;
int n,m,k;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool BFS(){
queue<Node> Q;
int ans = INF;
Node t,s;
Q.push(Node(0,0,0));
visit[0][0][0] = true;
while(!Q.empty()){
t = Q.front();Q.pop();
if(t.x==goal.x && t.y == goal.y && t.z == goal.z && t.val<=k) { ans=min(ans,t.val);continue;}
for(int d=0;d<4;d++){
int newx = t.x + dir[d][0];
int newy = t.y + dir[d][1];
if(newx >= 0 && newx < n && newy >=0 && newy < m && !visit[t.z][newx][newy] && mat[t.z][newx][newy]!='*'){
if(mat[t.z][newx][newy]=='#' && !visit[t.z^1][newx][newy]){
s.x =newx,s.y= newy ,s.val = t.val+1,s.z = t.z^1;
visit[t.z^1][newx][newy] = visit[t.z][newx][newy] = true;
Q.push(s);
}else{
s.x = newx , s.y = newy,s.val = t.val+1,s.z = t.z;
visit[t.z][newx][newy] = true;
//if(t.val <= k)
Q.push(s);
}
}
}
}
return ans!=INF;
}
void solve_question(){
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(mat[0][i][j]=='*' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
if(mat[0][i][j]=='#' && mat[1][i][j]=='*') mat[0][i][j] = mat[1][i][j] = '*';
if(mat[0][i][j]=='#' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
}
printf("%s\n",BFS()?"YES":"NO");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&k);
for(int k=0;k<2;k++)
for(int i=0;i<n;i++){
scanf("%s",mat[k][i]);
for(int j=0;j<m;j++)
if(mat[k][i][j]=='P') goal.x = i,goal.y = j,goal.z = k;
}
solve_question();
}
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 10 + 5;
const int INF = (1<<30);
char mat[2][N][N];
bool visit[2][N][N];
typedef struct node{
int x,y,z,val;
node(int x=0,int y=0,int z=0,int val=0):x(x),y(y),z(z),val(val){}
}Node;
Node goal;
int n,m,k;
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool BFS(){
queue<Node> Q;
int ans = INF;
Node t,s;
Q.push(Node(0,0,0));
visit[0][0][0] = true;
while(!Q.empty()){
t = Q.front();Q.pop();
if(t.x==goal.x && t.y == goal.y && t.z == goal.z && t.val<=k) { ans=min(ans,t.val);continue;}
for(int d=0;d<4;d++){
int newx = t.x + dir[d][0];
int newy = t.y + dir[d][1];
if(newx >= 0 && newx < n && newy >=0 && newy < m && !visit[t.z][newx][newy] && mat[t.z][newx][newy]!='*'){
if(mat[t.z][newx][newy]=='#' && !visit[t.z^1][newx][newy]){
s.x =newx,s.y= newy ,s.val = t.val+1,s.z = t.z^1;
visit[t.z^1][newx][newy] = visit[t.z][newx][newy] = true;
Q.push(s);
}else{
s.x = newx , s.y = newy,s.val = t.val+1,s.z = t.z;
visit[t.z][newx][newy] = true;
//if(t.val <= k)
Q.push(s);
}
}
}
}
return ans!=INF;
}
void solve_question(){
memset(visit,0,sizeof(visit));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(mat[0][i][j]=='*' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
if(mat[0][i][j]=='#' && mat[1][i][j]=='*') mat[0][i][j] = mat[1][i][j] = '*';
if(mat[0][i][j]=='#' && mat[1][i][j]=='#') mat[0][i][j] = mat[1][i][j] = '*';
}
printf("%s\n",BFS()?"YES":"NO");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&n,&m,&k);
for(int k=0;k<2;k++)
for(int i=0;i<n;i++){
scanf("%s",mat[k][i]);
for(int j=0;j<m;j++)
if(mat[k][i][j]=='P') goal.x = i,goal.y = j,goal.z = k;
}
solve_question();
}
return 0;
}
搜索专题: HDU2102 A计划的更多相关文章
- HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...
- NOIP2018提高组金牌训练营——搜索专题
NOIP2018提高组金牌训练营——搜索专题 1416 两点 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不 ...
- 搜索专题:Balloons
搜索专题:Balloons 这道题一看与时间有关,第一想到的就是BFS,定义一个状态,包含每一个状态的剩余气球数,已经进行的时间和每一个志愿者上一次吹气球的时间: 每一次状态转换时,检查是否有没有使用 ...
- 2014 UESTC暑前集训搜索专题解题报告
A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...
- 【PHP高效搜索专题(2)】sphinx&coreseek在PHP程序中的应用实例
PHP可以通过三种途径来调用sphinx 通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本) 通过安装SphinxSE,然后创建一个中介sphinxSE类型的表,再通 ...
- 【PHP高效搜索专题(1)】sphinx&Coreseek的介绍与安装
我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量+大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键 ...
- Hdu2102 A计划 2017-01-18 14:40 60人阅读 评论(0) 收藏
A计划 Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissio ...
- 2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
Eight Puzzle Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 ...
- 2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
邱老师降临小行星 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 Des ...
随机推荐
- 安装caffe碰到的坑(各种.so未找到)
./include/caffe/common.hpp:4:32: fatal error: boost/shared_ptr.hpp: 没有那个文件或目录 所有类似于上面的错误,都可以用如下格式来解决 ...
- Comet OJ - Contest #12 D
题目描述 求(x,y)的对数满足x∈[0,a],y∈[0,b],x⊕y=0且|x-y|<=m 题解 一种比较sb的做法是考虑x-y的借位,根据借位以及差值进行转移 还有一种比较正常的做法,假设一 ...
- markdown编辑器常用命令
# 标题H1## 标题H2### 标题H3#### 标题H4##### 标题H5###### 标题H5插入java代码: 以```java表示java代码开始,以```表示代码结束 ```javapu ...
- jmeter--单个接口通,自动化不通时
单个接口通,自动化不通时,对比两者请求 post 请求的格式,内容编码
- AOP aspect XML 配置
/** * 00配置接入点:定义一个切入点 * execution(* com.foen.foensys.controller..*.*(..))") "*" 第一个* ...
- XML 浏览器支持
几乎所有的主流浏览器均支持 XML 和 XSLT. Mozilla Firefox 从 1.0.2 版本开始,Firefox 就已开始支持 XML 和 XSLT(包括 CSS). Mozilla Mo ...
- 常见对象-Object类
Object类概述 是类层次结构的根类,每个类都直接或者间接继承该类. eg: 1.class Student extends Object{} //直接继承 2.class Student ext ...
- HDU 2546 饭卡(01背包)
题目代号:HDU 2546 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/ ...
- Java连接Oracle数据库常用方法
JDBC的六大步骤: 注册驱动 获取连接 获取执行sql语句对象 执行sql语句 处理结果集 关闭资源 oracle URL: jdbc:oracle:thin:@localhost:1521:SID ...
- python之random随机函数
random.random()用于生成 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成随机数 1 n: a <= n <= b.如果 ...