这道题的钥匙只有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+状态压缩)的更多相关文章

  1. hdu - 1429 胜利大逃亡(续) (bfs状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 终于开始能够做状态压缩的题了,虽然这只是状态压缩里面一道很简单的题. 状态压缩就是用二进制的思想来表示状态 ...

  2. hdu 1429 胜利大逃亡(续) (bfs+状态压缩)

    又开始刷题了 题意:略过. 分析:主要是确定状态量,除了坐标(x,y)之外,还有一个key状态,就好比手上拿着一串钥匙.状态可以用位运算来表示:key&(x,y)表示判断有没有这扇门的钥匙,k ...

  3. hdu 1429 胜利大逃亡(续)(bfs+位压缩)

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

  4. HDOJ 1429 胜利大逃亡(续) (bfs+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 思路分析:题目要求找出最短的逃亡路径,但是与一般的问题不同,该问题增加了门与钥匙约束条件: 考虑 ...

  5. hdu.1429.胜利大逃亡(续)(bfs + 0101011110)

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

  6. HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  7. hdu 1429 胜利大逃亡(续)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...

  8. HDU 1429 胜利大逃亡(续)(DP + 状态压缩)

    胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢 ...

  9. HDU 1429 胜利大逃亡(续)(bfs)

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

  10. 胜利大逃亡(续)(状态压缩bfs)

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

随机推荐

  1. Python 之 格式化文件

    # 结构化文件存储- xml, json- 为了解决不同设备之间的信息交换 ## XML文件(可扩展标记语言) - 标记语言:语言中使用尖括号括起来的文本字符串标记 - 可扩展:用户可以自己定义需要的 ...

  2. maven引入MySQL相关依赖

    <!--mysql驱动包--> <dependency> <groupId>mysql</groupId> <artifactId>mysq ...

  3. MAVEN项目的搭建

    MAVEN能为我们做什么? 1.Jar的声明式依赖性管理 2.项目的自动构建 搭建流程 环境配置 http://maven.apache.org/download.html 下载最新版本Maven 3 ...

  4. (5)全局异常捕捉【从零开始学Spring Boot】

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...

  5. 警告: 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 ...

  6. hdu 1703

    #include<stdio.h> #define  N  11000 int a[N]; int main() {     int i,n;     a[1]=0;a[2]=5;a[3] ...

  7. zTree 无子节点 单击事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. BA-siemens-apogee-ppcl

    adapts函数的使用 常规控制风机及阀门的程序是使用PID来调节,但是自适应算法能更好的调节. 西门子的自适应调节函数adapts用法如下: 以下文章为网络转载,原文链接地址http://news. ...

  9. xcode对照两个分支中同一个文件

    对于同一个项目的两个分支,由于两个分支可能各自都做了一些改动.所以通过Source Control中的History...功能是无法查看的.例如以下图: 这个时候.我们须要用到xcode的另外一个功能 ...

  10. 检测Nginx访问成功(状态码200)的IP及次数

    cat  access.log |awk '{print $1,$9}'|grep '200'|sort | uniq -c|awk '{print $2" "$1}'