救基友记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. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  2. DbCommandInterceptor抓取EF执行时的SQL语句

    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...

  3. 使用.NET Core+Docker 开发微服务

    .NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜, ...

  4. python错误、调试、测试

    1.错误, Python内置的try...except...finally用来处理错误十分方便.出错时,会分析错误信息并定位错误发生的代码位置才是最关键的. 程序也可以主动抛出错误,让调用者来处理相应 ...

  5. Codeforces 449C Jzzhu and Apples 贪心 (看题解)

    Jzzhu and Apples 从大的质因子开始贪心, 如果有偶数个则直接组合, 如果是奇数个留下那个质数的两倍, 其余两两组合. #include<bits/stdc++.h> #de ...

  6. zstu 4247-萌新的旅行

    题目大意: zstu的萌新们准备去自助旅行,他们租了一辆吉普车,然后选择了n个城市作为游览地点.然后他们惊喜的发现他们选择的城市刚好绕城一个环. 也就是说如果给所有城市按照0,1,2,……,n-1编号 ...

  7. Python作业-选课系统

    目录 Python作业-选课系统 days6作业-选课系统: 1. 程序说明 2. 思路和程序限制 3. 选课系统程序目录结构 4. 测试帐户说明 5. 程序测试过程 title: Python作业- ...

  8. css 选择器、元素默认宽度、media screen

    @media screen and (min-width:800px){ .a{  background: url('../image/banner/banner1.jpg') no-repeat l ...

  9. Ubuntu 初始配置

      1)在修改source.list前,最好先备份一份 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backu2. 2)执行命令打开sour ...

  10. 利用python计算多边形面积

    最近业务上有一个需求,给出多边形面积. Google了一下,发现国内论坛给的算法都是你抄我我抄你,也不验证一下是否正确, 从 博客园到csdncsdn 然后传播到国内各个角落...真是无力吐槽了. 直 ...