救基友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 这道题是要求最小的消耗血量伤害,但是并不是最先到 ...
随机推荐
- python3笔记(一)初识Python
基础资料 什么是Python? Python官方网站 安装Python python的优点 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. pyth ...
- Spring 核心API
BeanFactory: 这是一个工厂,用于生产任意Bean,采用延迟加载,第一次getBean时才会加载 ApplicationContext: 是BeanFactory的一个子接口,功能更强大(国 ...
- git merge简介
git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...
- poj 1511 正向 反向 构两个图
有向图 源点为1 求源点到其他各点的最短距离之和 再在其他点到源点的最短距离之和 再加起来 多源点一终点 只要反向构图就行了 Sample Input 2 //T2 2 //结点数 边数1 2 13 ...
- 如何获取JMX监控WebSphere所需的com.ibm.ws.admin.client_8.5.0等jar包
https://blog.csdn.net/weixin_38645718/article/details/83346007
- Delphi数据库数据用文件流方式快速写入Excel文件
在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理.这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动 ...
- HDU5730
cdq分治+FFT 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)
- day17--JQuery选择器
操作HTML标签的时候,我们首先要找到HTML标签的位置,然后进行操作,下面来看看集中查找标签的方法,如下: 1.Id选择器 -- Id在HTML中是唯一的,通过Id进行查找,Id ...
- redis分布式锁小试
一.场景 项目A监听mq中的其他项目的部署消息(包括push_seq, status, environment,timestamp等),然后将部署消息同步到数据库中(项目X在对应环境[environm ...
- codeforces-1111
https://www.cnblogs.com/31415926535x/p/10397007.html codeforces 537 div2 A 题意就是给你两个字符串,然后如果s,t的对应位上的 ...