救基友3(三维BFS)
救基友记3
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
妖怪的闺房是一个n*m的矩阵,而且某些地方安装了带锁的门。钥匙藏在闺房另外的某些地方。
刚開始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟仅仅能从一个坐标走到相邻四个坐标中的当中一个。妖怪每t分钟回闺房视察一次。若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。如今请你帮他计算是否能再次成功逃亡。
仅仅要在妖怪下次视察之前走到出口就算离开闺房。假设妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。
输入
. 代表路
* 代表墙
@ 代表CZ的起始位置
^ 代表闺房的出口
A-J 代表带锁的门,相应的钥匙分别为a-j
a-j 代表钥匙,相应的门分别为A-J
每组測试数据之间有一个空行。
输出
演示样例输入
4 5 17
@A.B.
a*.*.
*..*^
c..b* 4 5 16
@A.B.
a*.*.
*..*^
c..b*
演示样例输出
16
-1
提示
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue> #define MAX INT_MAX
#define MIN INT_MIN
#define max(a,b) (a>b)?a:b
#define min(a,b) (a<b)?a:b
#define lson l,m,rt>>1
#define rson m+1,r,rt>>1|1
const int SIZE = (1<<10)+10;
using namespace std; int n,m,T,xx,xy;
struct node{
int x,y,z,ans;
};
int vis[22][22][SIZE];
char a[22][22];
int mv[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
int Jin_zhi(int tep,int san)
{
int mm;
for(int jj = 0;jj<tep;jj++)
{
mm = san % 2;
san /= 2;
}
return mm;
}
void BFS()
{
node f,t;
queue<node>q ;
memset(vis,0,sizeof(vis));
f.x = xx; f.y = xy; f.z = 0;f.ans = 0;
q.push(f);
vis[xx][xy][0] = 1 ;
while(!q.empty())
{
t = q.front();
q.pop();
if(a[t.x][t.y]=='^' && t.ans < T)
{
printf("%d\n",t.ans);
return ;
}
for(int i = 0;i<4;i++)
{
f.x = t.x + mv[i][0];
f.y = t.y + mv[i][1];
f.z = t.z;
if(0<=f.x && f.x<n&& 0<=f.y && f.y<m&&!vis[f.x][f.y][f.z])
{
if(a[f.x][f.y]=='.' || a[f.x][f.y]=='@' || a[f.x][f.y]=='^')
{
f.ans = t.ans + 1;
vis[f.x][f.y][f.z] = 1 ;
q.push(f);
}
else if('a'<=a[f.x][f.y] && a[f.x][f.y] <='j')
{
f.ans = t.ans + 1;
int tep = a[f.x][f.y] - 'a'+1;
int san = f.z,flag;
flag = Jin_zhi(tep,san); if(!flag)
f.z += pow(2,tep-1); vis[f.x][f.y][f.z] = 1;
q.push(f);
}
else if('A'<=a[f.x][f.y] && a[f.x][f.y] <='J')
{
int tep = a[f.x][f.y] - 'A'+1;
f.ans = t.ans + 1;
int san = f.z,flag; flag = Jin_zhi(tep,san);
if(flag==1)
{
f.ans = t.ans + 1;
vis[f.x][f.y][f.z] = 1;
q.push(f);
}
}
}
}
}
puts("-1");
}
int main()
{
int flag;
while(~scanf("%d%d%d",&n,&m,&T))
{
flag = 0;
for(int i = 0;i<n;i++)
{
scanf("%*c%s",a[i]);
if(flag) continue;
for(int j = 0;j<m;j++)
{
if(a[i][j]=='@')
{
xx = i; xy = j;
flag = 1;
break;
}
}
}
BFS();
}
return 0;
}
救基友3(三维BFS)的更多相关文章
- sdut2193救基友记3(三维)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2193 救基友记3 Time Limit: 10 ...
- hdu 1240:Asteroids!(三维BFS搜索)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- POJ 2049— Finding Nemo(三维BFS)10/200
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...
- POJ.2251 Dungeon Master (三维BFS)
POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...
- AOJ.866 飞越原野 (三维BFS)
AOJ.866 飞越原野 (三维BFS) 题意分析 点我挑战题目 相比于普通的BFS,要多一维来记录当前剩余的体力.而且还要额外的一层循环来处理,飞过的路程. 代码总览 #include <io ...
- SDUT OJ 1124 飞越原野 (三维BFS练习)
飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...
- Java练习 SDUT-2192_救基友记2
救基友记2 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 屌丝WP的好基友CZ又被妖鬼给抓走了(CZ啊,CZ-.怎么说 ...
- hdu 1885 Key Task (三维bfs)
题目 之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下.... 还要注意用bfs的时候 有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到 ...
随机推荐
- 02_kettle插件开发
先下载标准插件模板 地址 http://www.ahuoo.com/download/TemplateStepPlugin.rar 将下载的jar包解压后 导入eclipse项目中 有 ...
- poj 1125 谣言传播 Floyd 模板题
假如有3个点 点1到点2要5分钟 点1到点3要3分钟 那么5分钟的时间可以传遍全图 所以要先找一个点到其他点的最长时间 再从最长的时间里找出最小值 Sample Input 3 // 结点数2 2 4 ...
- 详解webpack中的hash、chunkhash、contenthash区别
hash.chunkhash.contenthash hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容改变的话,那么对应文件哈希值也会 ...
- [转] Optimizely:在线网站A/B测试平台
Optimizely:在线网站A/B测试平台是一家提供 A/B 测试服务的公司.A/B 测试能够对比不同版本的设计,选取更吸引用户眼球的那一款,从而带来更为优化的个人体验.让网站所有者易于对不同版本的 ...
- poj 3415
对拍没错..莫名wa了 利用容斥求每个串的重复子串 其实就是找到每个元素能扩展到的最大元素 即(rr-i)*(i-lr)*(w[i]-kk) 就可以了 然后处理这个先离散化再搞 另外是x y要清空 # ...
- 交叉编译和安装ARM板(RK3288)和Linux 3.10上的RTL8188无线网卡驱动
插入无线网卡,输入ifconfig,发现没有检测到网卡. 输入lsusb,查看无线网卡型号. 我用的无线网卡是EDUP的网卡,包装盒里有一张驱动光盘,把光盘里linux下的驱动目录复制下来.如果没有驱 ...
- 百度地图API如何给自定义覆盖物添加事件
摘要: 给marker.lable.circle等Overlay添加事件很简单,直接addEventListener即可.那么,自定义覆盖物的事件应该如何添加呢?我们一起来看一看~ --------- ...
- 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-5 random direction & ONB
Preface 往后看了几章,对这本书有了新的理解 上一篇,我们第一次尝试把MC积分运用到了Lambertian材质中,当然,第一次尝试是失败的,作者发现它的渲染效果和现实有些出入,所以结尾处声明要 ...
- Xamarin.Android部署失败
Xamarin.Android部署失败 项目编译.生成没有错误信息,并且可以找到生成的APK包,但部署失败.提示信息如下: "apksigner.BAT"已退出,代码为1. ...
- C#窗体向另一个窗体实时传值及传值问题
C#窗体向另一个窗体实时传值 另外的传值方法: