胜利大逃亡(续)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8175    Accepted Submission(s): 2933

Problem Description
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……

这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。

 
Input
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

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

 
Output
针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
 
Sample Input
4 5 17
@A.B.
a*.*.
*..*^
c..b*
 
 
4 5 16
@A.B.
a*.*.
*..*^
c..b*
 
Sample Output
16
-1
 
Author
LL
 
Source
代码:
//显然bfs,但是要记录访问过的状态,用二进制记录访问过的状态vis[21][21][1<<11],[1<<10]记录10把钥匙的状态
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct Lu
{
char mp[][];
int px,py,tim;
int sta;
}L;
int dir[][]={,,-,,,,,-};
bool vis[][][<<];
int n,m,t;
int bfs()
{
queue<Lu>q;
Lu L1,L2;
memset(vis,,sizeof(vis));
vis[L.px][L.py][]=;
L.tim=;L.sta=;
q.push(L);
while(!q.empty()){
L1=q.front();
q.pop();
if(L1.tim>=t) break;//超过时间就不用搜了
if(L1.mp[L1.px][L1.py]=='^') return L1.tim;
for(int i=;i<;i++){
int x=L1.px+dir[i][],y=L1.py+dir[i][];
if(x<||x>=n||y<||y>=m) continue;
if(L1.mp[x][y]=='*') continue;
if(L1.mp[x][y]>='a'&&L1.mp[x][y]<='j'){
L2=L1;
L2.sta=(L1.sta|(<<(L1.mp[x][y]-'a')));
vis[x][y][L1.sta]=;
L2.px=x;L2.py=y;
L2.mp[x][y]='.';
L2.tim++;
q.push(L2);
}
if(L1.mp[x][y]>='A'&&L1.mp[x][y]<='J'){
int now=(<<(L1.mp[x][y]-'A'));
if(!(now&L1.sta)) continue;
L2=L1;
vis[x][y][L1.sta]=;
L2.px=x;L2.py=y;
L2.mp[x][y]='.';
L2.tim++;
q.push(L2);
}
else if(!vis[x][y][L1.sta]){
L2=L1;
vis[x][y][L1.sta]=;
L2.px=x;L2.py=y;
L2.tim++;
q.push(L2);
}
}
}
return -;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF){
for(int i=;i<n;i++){
scanf("%s",L.mp[i]);
for(int j=;j<m;j++)
if(L.mp[i][j]=='@') {L.px=i;L.py=j;}
}
int ans=bfs();
printf("%d\n",ans);
}
return ;
}

HDU1429 bfs的更多相关文章

  1. HDU1429+bfs+状态压缩

    bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...

  2. BFS+状态压缩 HDU1429

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. 胜利大逃亡(续)hdu1429(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. hdu1429之BFS

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】

    题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...

  6. 胜利大逃亡 HDU1429 (bfs)

    最后两题算是这个专题最难的两题了 这题关键是标记数组 我一开始设置的是 四维的  第三维是朝向  第四维是钥匙个数 但是 不同的取法钥匙个数可能会重复   如:取ab钥匙和取ac钥匙都是两枚  导致w ...

  7. BFS+二进制状态压缩 hdu-1429

    好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...

  8. hdu1429(bfs+状态压缩)

    思路:有十个门,有十把钥匙,每把钥匙对应一个门,相同的门可以有多个.这样,我们就得按照状态来搜索,用0000000001代表第一个门有钥匙了,1000000000代表第十个门钥匙有了.......一次 ...

  9. HDU1429 胜利大逃亡 状压bfs

    http://acm.hdu.edu.cn/viewcode.php?rid=22225154 因为总共a-j有10种钥匙,所以可以把有没有钥匙的状态压到一个int数里,然后dfs. 昨天状态特别不好 ...

随机推荐

  1. hack,不同的IE浏览器

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. apache-tomcat-7.0.70无法进入Manager管理App项目

    在tomcat文件夹找到conf文件夹中的tomcat-user.xml文件,用记事本打开,在最下面可以看到tomcat默认把用户注释掉了,也就是说打开tomcat主页是进不去管理页面的.方法如下:找 ...

  3. Linux一些命令

    1.查看系统安装软件 rpm -qa  //(不包括绿色安装的软件程序,也就是直接在安装目录中启动的不包括) rpm -qa |grep gcc 参数解释:q ——询问 a —— 查询全部   l — ...

  4. Chapter 1 First Sight——21

    They were sitting in the corner of the cafeteria, as far away from where I sat as possible in the lo ...

  5. Viewpager以及ViewPagerIndicator的相关使用

    ViewPagerIndicator开源框架可以用来在ViewPager上方做标题,可以在ViewPager下方做跟随移动的小圆点,这个类库必须和自己的项目在电脑的同一磁盘盘符下,比如都在D盘或者E盘 ...

  6. jquery 事件注册 与重复事件处理

    <!doctype html><html lang="us"><head><meta charset="utf-8"& ...

  7. Angularjs循环二维数组

    <div ng-app> <div ng-controller="test"> <div ng-repeat="links in slide ...

  8. USB的八个问题和答案(转)

    http://www.amobbs.com/thread-901041-1-1.html 问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D ...

  9. gen_grant_dml.sql

    set echo off feedback off verify off pagesize 0 linesize 120 define v_grantee                = & ...

  10. 【贪心】时空定位I

    [贪心]时空定位I 题目描述 张 琪曼已经确定了李旭琳在一个长为20千米,宽为2千米的空间,她要在横中心线上放置半径为Ri的定位装置,每个定位装置的效果都会让以它为中心的半径为实 数Ri(0<R ...