HDU 1429 胜利大逃亡(续)(DP + 状态压缩)
胜利大逃亡(续)
这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
# include<iostream>
# include<cstring>
# include<cstdio>
# include<queue>
using namespace std;
struct node{
int x,y,key;
}; char map[][];
int vis[][][];
int n,m,t;
int dx[]={,,-,};
int dy[]={,,,-}; int bfs(int sx,int sy){
int x,y,key;
memset(vis,,sizeof(vis));
queue<node> q;
node temp;
temp.x = sx; temp.y = sy; temp.key = ;
q.push(temp);
while(!q.empty()){
temp = q.front(); q.pop();
sx = temp.x; sy = temp.y; key = temp.key;
if(vis[sx][sy][key] > t)
return -;
int i;
for(i=;i<;i++){
x = sx+dx[i]; y = sy+dy[i];
if(x< || x>=n ||y< ||y>=m)
continue;
if(map[x][y]== '^')
return vis[sx][sy][key]+;
if(map[x][y]=='*' || vis[x][y][key])
continue;
if(map[x][y]=='.' || map[x][y] == '@'){
vis[x][y][key] = vis[sx][sy][key] + ;
temp.x = x; temp.y = y; temp.key = key;
q.push(temp);
}
if(map[x][y] >='a' && map[x][y]<='j'){
int key1 = (key|(<<(map[x][y]-'a')));
vis[x][y][key1] = vis[sx][sy][key] + ;
temp.x = x; temp.y = y; temp.key = key1;
q.push(temp);
}
if(map[x][y]>='A' && map[x][y]<='J'){
if(key & (<<(map[x][y]-'A'))){
vis[x][y][key] = vis[sx][sy][key] + ;
temp.x = x; temp.y = y; temp.key = key;
q.push(temp);
}
}
}
}
return -;
} int main(){
int sx,sy,i,j;
while(scanf("%d%d%d",&n,&m,&t)!=EOF){
for(i=;i<n;i++){
scanf("%s",map[i]);
for(j=;j<m;j++){
if(map[i][j]=='@')
{ sx=i; sy=j; }
}
}
int ans = bfs(sx,sy);
if(ans<t)
printf("%d\n",ans);
else
printf("-1\n");
}
return ;
}
HDU 1429 胜利大逃亡(续)(DP + 状态压缩)的更多相关文章
- hdu - 1429 胜利大逃亡(续) (bfs状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...
- hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...
- hdu 1429 胜利大逃亡(续)(bfs+位压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...
- HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1429 胜利大逃亡(续)
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Hdu 1429 胜利大逃亡(续) 分类: Brush Mode 2014-08-07 17:01 92人阅读 评论(0) 收藏
胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- HDU 1429 胜利大逃亡(续)(bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
随机推荐
- Keepass 2.x 之 同步与触发器
同步 之前用的 Keepass 1.x, 要实现工作电脑和个人电脑上的数据库文件同步,使用的是第三方的网盘同步.但有个问题就是,个人不习惯设置同步网盘开机启动,所以有时候工作电脑上的改动还没有同步上传 ...
- HW4.25
public class Solution { public static void main(String[] args) { double sum; for(int i = 10000; i &l ...
- UIButton set touch handler in code
One option is to set the button up using [myButton addTarget:yourOtherClass action:@selector(mySelec ...
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...
- webapp 慎用setInterval、setTimeout
其实这片文章刚开始我啥也没写的,但也有20多的访问量,所以觉得大家还是比较关注这个问题,所以找机会写下. 问题的引出: 为什么我说的时webapp中慎用setInterval.setTimeout, ...
- 337. House Robber III
二刷吧..不知道为什么house robbery系列我找不到笔记,不过印象中做了好几次了. 不是很难,用的post-order做bottom-up的运算. 对于一个Node来说,有2种情况,一种是选( ...
- listview加载图片显示
Adapter: ---- //adapter的构造方法: 参数1 为url数组: public static String[] mList;// 讲url保村在静态的String[] 中 在 ...
- Android开发——新特性与知识点回顾
Fragment 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity 定义布局文件作为Fra ...
- PAT 1004. Counting Leaves (30)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family membe ...
- PHP判断变量是否为长整形的方法
PHP判断变量是否为长整形的方法,可用于判断QQ号等,避免了int溢出的问题 <?php /** * 判断变量是否为长整数(int与整数float) * @param mixed $var * ...