Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
这道题的钥匙只有10个,可以压成二进制
这里有有句非常关键的话
(k & door[x][y]) == door[x][y]
一开始以为只要(k & door[x][y]) ==1就可以了
后来发现如果door[x][y]为0的话,这句话就不对了。
所以要包含这里没有门的情况
所以要这么写
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 25;
struct node { int x, y, step, key; };
int key[MAXN][MAXN], door[MAXN][MAXN], vis[MAXN][MAXN][1050];
int arr[MAXN][MAXN], sx, sy, ex, ey, n, m, t;
int dir[4][2] = {0, 1, 0, -1, -1, 0, 1, 0};
bool judge(int x, int y, int k)
{
if(!(0 <= x && x < n && 0 <= y && y < m)) return false;
if(vis[x][y][k] || arr[x][y]) return false;
if(!((k & door[x][y]) == door[x][y])) return false;
return true;
}
int bfs()
{
queue<node> q;
q.push(node{sx, sy, 0, 0});
vis[sx][sy][0] = 1;
while(!q.empty())
{
node u = q.front(); q.pop();
if(u.x == ex && u.y == ey) return u.step;
REP(i, 0, 4)
{
int x = u.x + dir[i][0], y = u.y + dir[i][1];
if(!judge(x, y, u.key)) continue;
int k = u.key | key[x][y];
vis[x][y][k] = 1;
q.push(node{x, y, u.step + 1, k});
}
}
return 1e9;
}
int main()
{
while(~scanf("%d%d%d", &n, &m, &t))
{
memset(door, 0, sizeof(door));
memset(key, 0, sizeof(key));
memset(vis, 0, sizeof(vis));
memset(arr, 0, sizeof(arr));
REP(i, 0, n)
{
char s[MAXN];
scanf("%s", s);
REP(j, 0, m)
{
char ch = s[j];
if(ch == '*') arr[i][j] = 1;
if(ch == '@') sx = i, sy = j;
if(ch == '^') ex = i, ey = j;
if('a' <= ch && ch <= 'z' ) key[i][j] = 1 << (ch - 'a');
if('A' <= ch && ch <= 'Z' ) door[i][j] = 1 << (ch - 'A');
}
}
int ans = bfs();
printf("%d\n", ans < t ? ans : -1);
}
return 0;
}
Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)的更多相关文章
- 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 + 0101011110)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 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 胜利大逃亡(续)(DP + 状态压缩)
胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...
- HDU 1429 胜利大逃亡(续)(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 S ...
随机推荐
- Python 之 格式化文件
# 结构化文件存储- xml, json- 为了解决不同设备之间的信息交换 ## XML文件(可扩展标记语言) - 标记语言:语言中使用尖括号括起来的文本字符串标记 - 可扩展:用户可以自己定义需要的 ...
- maven引入MySQL相关依赖
<!--mysql驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysq ...
- MAVEN项目的搭建
MAVEN能为我们做什么? 1.Jar的声明式依赖性管理 2.项目的自动构建 搭建流程 环境配置 http://maven.apache.org/download.html 下载最新版本Maven 3 ...
- (5)全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- 警告: The APR based Apache Tomcat Native library failed to load.
警告: The APR based Apache Tomcat Native library failed to load. The error reported was [C:\apache-tom ...
- hdu 1703
#include<stdio.h> #define N 11000 int a[N]; int main() { int i,n; a[1]=0;a[2]=5;a[3] ...
- zTree 无子节点 单击事件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- BA-siemens-apogee-ppcl
adapts函数的使用 常规控制风机及阀门的程序是使用PID来调节,但是自适应算法能更好的调节. 西门子的自适应调节函数adapts用法如下: 以下文章为网络转载,原文链接地址http://news. ...
- xcode对照两个分支中同一个文件
对于同一个项目的两个分支,由于两个分支可能各自都做了一些改动.所以通过Source Control中的History...功能是无法查看的.例如以下图: 这个时候.我们须要用到xcode的另外一个功能 ...
- 检测Nginx访问成功(状态码200)的IP及次数
cat access.log |awk '{print $1,$9}'|grep '200'|sort | uniq -c|awk '{print $2" "$1}'