HDU_1429——胜利大逃亡续,十位二进制状态压缩,状态判重
这次魔王汲取了上次的教训,把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
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int dir[][] = {,,,-,,,-,};
int n, m, t;
char map[][]; struct node
{
int x, y, key; //key的每一个二进制位代表一种钥匙
int step;
bool out(void)
{
if(map[x][y] == '^')
{
return true;
}
return false;
}
bool check(void)
{
if(x>= && x<n && y>= && y<m)
{
if(map[x][y] != '*')
{
return true;
}
}
return false;
}
bool is_key(void)
{
if(map[x][y]>='a' && map[x][y]<='j')
{
return true;
}
return false;
}
bool is_door(void)
{
if(map[x][y]>='A' && map[x][y]<='J')
{
return true;
}
return false;
}
}u,v; //标记已搜索过的状态,根据主角手中拿到的不同的钥匙及其所在位置来区分不同的状态,
//就像推箱子中,用所达某一位置时人物面对的方向来标记某一个状态
int mark[][][]; //数组太大不能在函数中定义
int BFS(void)
{
memset(mark,,sizeof(mark));
queue<node>que;
que.push(u); while(!que.empty())
{
u = que.front();
que.pop(); if(u.out()) //逃出
{
return (t - u.step);
}
for(int i=; i<; i++) //枚举方向
{
v.x = u.x + dir[i][];
v.y = u.y + dir[i][];
v.step = u.step - ;
v.key = u.key; if(v.step == ) //逃不出
{
continue;
} if(v.check() && !mark[v.x][v.y][v.key]) //检查越界,撞墙,标记重复
{
if(v.is_key()) //走到钥匙
{
v.key |= << (map[v.x][v.y] - 'a'); //把钥匙带走,对应二进制标志位置1
}
else if(v.is_door()) //走到门
{
if((v.key & ( << (map[v.x][v.y] - 'A'))) == ) //身上的钥匙不能开这个门
{
continue;
}
}
mark[v.x][v.y][v.key] = ;
que.push(v);
}
}
}
return -;
} int main()
{
while(~scanf("%d%d%d", &n,&m,&t))
{
for(int i=; i<n; i++)
{
scanf("%s", map[i]);
for(int j=; j<m; j++)
{
if(map[i][j] == '@')
{
u.x = i;
u.y = j;
u.key = ;
u.step = t;
}
}
}
printf("%d\n",BFS());
}
return ;
}
HDU_1429——胜利大逃亡续,十位二进制状态压缩,状态判重的更多相关文章
- hdu1429 胜利大逃亡(续) 【BFS】+【状态压缩】
题目链接:https://vjudge.net/contest/84620#problem/K 题目大意:一个人从起点走到终点,问他是否能够在规定的时间走到,在走向终点的路线上,可能会有一些障碍门,他 ...
- HDU 1429 胜利大逃亡(续)(DP + 状态压缩)
胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...
- HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】
题目:pid=1429">hdoj 1429 胜利大逃亡(续) 同样题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间.确定用BFS 这个题目的难点在于有几个锁对于几把钥匙.唯 ...
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 胜利大逃亡(续)(bfs+状态压缩)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(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 Su ...
随机推荐
- 176. [USACO Feb07] 奶牛聚会
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- VB编程技巧推荐
VB编程技巧推荐 1.zyl910的专栏——理论水平高 用VB写高效的图像处理程序 V2.0 优化分支代码——避免跳转指令堵塞流水线 2.Laviewpbt的专栏 —— 有很多算法的代码,实用性高 ...
- Java遍历Map、List、Array
1.遍历array,使用for循环或者foreach(本人建议使用) int arr[] = {2, 3, 1}; System.out.println("----1----排序前的一维数组 ...
- sql 学习笔记 p46
交换行 update tab1 set c1=c2,c2=c1 .说明sql是临时表的存储,在查询出来的结果为决定前,可以随意操纵临时表中的列 update tab set c1=c1+(selec ...
- Excel:您尝试打开的文件的格式与文件扩展名指定的格式不一致
报错信息: 打开文件时提示"您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致.打开文件前请验证文件没有损坏且来源可信.是否立即打开该文件?",卸载Office 20 ...
- (转)Mac OS X中配置Apache
我使用的Mac OS X版本是10.8.2,Mac自带了Apache环境. 启动Apache 设置虚拟主机 启动Apache 打开“终端(terminal)”,输入 sudo apachectl -v ...
- 创建DBLink语句
--linkName DBLink名 --username 用户名 --password 密码 --tns TNS配置字符串 create database link &linkName co ...
- 四、C#方法和参数
方法是一种组合一系列语句以执行一个特定操作或计算一个特殊结果的方式. 它能够为构成程序的语句提供更好的结构和组织. 在面向对象的语言中,方法总是和类关联在一起的,我们用类将相关的方法分为一组. 方 ...
- JavaScript验证身份证号
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncodin ...
- Hibernate 一对多双向关联Demo
以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { privat ...