救基友记3

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描写叙述

  话说CZ因为不守基道。被妖怪抓走了。好基友WP在努力讨好高富帅RQ救出CZ的同一时候。CZ也意识到了自己的错误,然后努力的想逃出妖怪的闺房。 

妖怪的闺房是一个n*m的矩阵,而且某些地方安装了带锁的门。钥匙藏在闺房另外的某些地方。

刚開始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟仅仅能从一个坐标走到相邻四个坐标中的当中一个。妖怪每t分钟回闺房视察一次。若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。如今请你帮他计算是否能再次成功逃亡。

仅仅要在妖怪下次视察之前走到出口就算离开闺房。假设妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。

输入

 每组測试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为闺房的地图,当中包含:

. 代表路

* 代表墙

@ 代表CZ的起始位置

^ 代表闺房的出口

A-J 代表带锁的门,相应的钥匙分别为a-j

a-j 代表钥匙,相应的门分别为A-J

每组測试数据之间有一个空行。

输出

 针对每组測试数据,假设能够成功逃亡。请输出最少须要多少分钟才干离开。假设不能则输出-1。

演示样例输入

4 5 17
@A.B.
a*.*.
*..*^
c..b* 4 5 16
@A.B.
a*.*.
*..*^
c..b*

演示样例输出

16
-1

提示

 用进制转换的方法标记第三维,也就是钥匙的状态,開始做的时候思路有错误,就想用二维数组做,可是后来问了P神后。也想明确了,当前状态的钥匙存储状态。无法保证同一时刻正在进行的还有一状态,有无钥匙,所以说必须是三维数组,同一时候存储当前第三维全部 该钥匙位置的状态

#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)的更多相关文章

  1. sdut2193救基友记3(三维)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2193 救基友记3 Time Limit: 10 ...

  2. hdu 1240:Asteroids!(三维BFS搜索)

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  4. POJ 2049— Finding Nemo(三维BFS)10/200

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/29562915 海底总动员.... 这个题開始 ...

  5. POJ.2251 Dungeon Master (三维BFS)

    POJ.2251 Dungeon Master (三维BFS) 题意分析 你被困在一个3D地牢中且继续寻找最短路径逃生.地牢由立方体单位构成,立方体中不定会充满岩石.向上下前后左右移动一个单位需要一分 ...

  6. AOJ.866 飞越原野 (三维BFS)

    AOJ.866 飞越原野 (三维BFS) 题意分析 点我挑战题目 相比于普通的BFS,要多一维来记录当前剩余的体力.而且还要额外的一层循环来处理,飞过的路程. 代码总览 #include <io ...

  7. SDUT OJ 1124 飞越原野 (三维BFS练习)

    飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...

  8. Java练习 SDUT-2192_救基友记2

    救基友记2 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 屌丝WP的好基友CZ又被妖鬼给抓走了(CZ啊,CZ-.怎么说 ...

  9. hdu 1885 Key Task (三维bfs)

    题目 之前比赛的一个题, 当时是崔老师做的,今天我自己做了一下.... 还要注意用bfs的时候  有时候并不是最先到达的就是答案,比如HDU 3442 这道题是要求最小的消耗血量伤害,但是并不是最先到 ...

随机推荐

  1. python3笔记(一)初识Python

    基础资料 什么是Python? Python官方网站 安装Python python的优点 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. pyth ...

  2. Spring 核心API

    BeanFactory: 这是一个工厂,用于生产任意Bean,采用延迟加载,第一次getBean时才会加载 ApplicationContext: 是BeanFactory的一个子接口,功能更强大(国 ...

  3. git merge简介

    git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...

  4. poj 1511 正向 反向 构两个图

    有向图 源点为1 求源点到其他各点的最短距离之和 再在其他点到源点的最短距离之和 再加起来 多源点一终点 只要反向构图就行了 Sample Input 2 //T2 2 //结点数 边数1 2 13 ...

  5. 如何获取JMX监控WebSphere所需的com.ibm.ws.admin.client_8.5.0等jar包

    https://blog.csdn.net/weixin_38645718/article/details/83346007

  6. Delphi数据库数据用文件流方式快速写入Excel文件

    在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理.这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动 ...

  7. HDU5730

    cdq分治+FFT 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)

  8. day17--JQuery选择器

        操作HTML标签的时候,我们首先要找到HTML标签的位置,然后进行操作,下面来看看集中查找标签的方法,如下:     1.Id选择器   -- Id在HTML中是唯一的,通过Id进行查找,Id ...

  9. redis分布式锁小试

    一.场景 项目A监听mq中的其他项目的部署消息(包括push_seq, status, environment,timestamp等),然后将部署消息同步到数据库中(项目X在对应环境[environm ...

  10. codeforces-1111

    https://www.cnblogs.com/31415926535x/p/10397007.html codeforces 537 div2 A 题意就是给你两个字符串,然后如果s,t的对应位上的 ...