BFS+状态压缩 HDU1429
胜利大逃亡(续)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3734 Accepted Submission(s): 1216
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
@A.B.
a*.*.
*..*^
c..b*
4 5 16
@A.B.
a*.*.
*..*^
c..b*
-1
HDU1429 题目链接:here
HDU1885 题目链接:here(与此题如出一辙)
BFS+状态压缩
用flag[x][y][key]标记已搜索过的状态,key的一个二进制位代表一种钥匙,如果获得了第 i 种钥匙,就将key的第 i 位置为1,如果访问有第 i 种锁的地方则要求key的第 i 位为1;
#include<cstdio>
#include<queue>
#define N 24 using namespace std; struct node
{
int x,y,key,dist;
}; char map[N][N],str[N];
int flag[N][N][1<<11],sx,sy,ans;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
queue<node> q; void bfs(void)
{
while(!q.empty()) q.pop();
node t,nt;
t.x=sx;
t.y=sy;
t.key=0;
t.dist=0;
q.push(t);
while(!q.empty()) {
t=q.front();
q.pop();
//printf("search:%d %d %d\n",t.x,t.y,t.key);
for(int i=0;i<4;i++) {
nt.dist=t.dist+1;
nt.key=t.key;
nt.x=t.x+dx[i];
nt.y=t.y+dy[i];
if(map[nt.x][nt.y]=='^' && ans>nt.dist) {
ans=nt.dist;
return ;
}
else if('a'<=map[nt.x][nt.y] && map[nt.x][nt.y]<='z') {
nt.key=t.key|(1<<(map[nt.x][nt.y]-'a'));
}
if(map[nt.x][nt.y]!='*' && flag[nt.x][nt.y][nt.key]==0 && nt.dist<ans) {
flag[nt.x][nt.y][nt.key]=1;
if('A'<=map[nt.x][nt.y] && map[nt.x][nt.y]<='Z') {
if((nt.key&(1<<(map[nt.x][nt.y]-'A')))) q.push(nt);
}
else q.push(nt);
}
}
}
} int main()
{
//freopen("1.in","r",stdin);
int n,m,t;
while(scanf("%d%d%d",&n,&m,&t)!=EOF) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
map[i][j]='*';
memset(flag[i][j],0,sizeof(flag[i][j]));
}
}
for(int i=1;i<=n;i++) {
scanf("%s",str);
for(int j=1;j<=m;j++) {
map[i][j]=str[j-1];
if('@'==map[i][j]) sx=i,sy=j,map[i][j]='.';
}
}
ans=t;
bfs();
if(ans<t) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
BFS+状态压缩 HDU1429的更多相关文章
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...
- HDU 1885 Key Task (BFS + 状态压缩)
题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...
- hdu 1429(bfs+状态压缩)
题意:容易理解,但要注意的地方是:如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败.因为这里我贡献了一次wa. 分析:仔细阅读题目之后,会发现最多的钥匙数量为10把,所以把这个作为题目的突破口, ...
- UVALive 3956 Key Task (bfs+状态压缩)
Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...
随机推荐
- Linux命令行之逗趣无极限
Linux命令行之逗趣无极限 . Linux"sl"命令行 尽管"sl"代表了"蒸汽机机头",但它是用来提醒那些命令行控们别把"l ...
- Linux进程间通信——使用流套接字
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...
- 【LeetCode练习题】Minimum Window Substring
找出包含子串的最小窗口 Given a string S and a string T, find the minimum window in S which will contain all the ...
- curl几个选项
1.--cacert 选项请看https://curl.haxx.se/docs/sslcerts.html 2.CURL库怎样验证服务器证书 [复制链接] 中提到:你是客户端, 你希望的是: 你拿 ...
- exit()与_exit()的区别
从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干道工序.exit( ...
- JS框架~Angularjs
无意中看到anytao的项目,工作台,使用了Angularjs框架,感觉在前端表现上用户体验比较好,于是就简单看了一下,原来使用很简单,或者说,人家把代码封装的很好,以至于开发人员调用时比较简单,呵呵 ...
- [置顶] Codeforces Round #190 (Div. 2)(完全)
好久没有写博客了,一直找不到有意义的题可以写,这次也不算多么有意义,只是今天是比较空的一天,趁这个时候写一写. A. B. 有一点贪心,先把每个拿去3的倍数,余下0或1或2,然后三个一起拿. 对于以上 ...
- HDU2842-Chinese Rings(递推+矩阵高速幂)
pid=2842">题目链接 题意:求出最少步骤解出九连环. 取出第k个的条件是,k-2个已被取出,k-1个仍在支架上. 思路:想必九连环都玩过吧,事实上最少步骤就是从最后一个环開始. ...
- css3 transiton
div { width:100px; height:100px; background:yellow; transition-property:width; transition-duration:1 ...
- 初始Knockout
Kncokout是一个轻量级的ui类库,通过应用MVVN模式得JavaScript前端简单化. MVVN模式:http://www.cnblogs.com/xueduanyang/p/3601471. ...