首先关于分层图思想详见2004的这个论文

https://wenku.baidu.com/view/dc57f205cc175527072208ad.html

这道题可以用状态压缩,我们对于每一把钥匙的状态只有两种,获得了或者没有获得,然后就可以用二进制方法表示,例如一共有5把钥匙,我们如果用二进制数01001表示当前状态,就意味着我们已经拥有了第一类钥匙,第四类钥匙(从右往左看),然后我们就可以把此时的状态压缩为一个int了,节省了很多的空间,具体的操作就用位运算实现。

然后就是简单粗暴的dfs过程。

不过有几个点需要注意

① 要加反边。

② 一个位置可能有多个钥匙,注意要用位与运算。

下面给出代码。

 #include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N = ; struct Node{
int x, y, step, state;
};
int n, m, p, t, tt, map[N][N][N][N], key[N][N], vis[N][N][ << ];
int py[][] = {{, }, {, -}, {-, }, {, }}; inline int bfs(){
queue < Node > q;
q.push((Node){, , , key[][]});
while(!q.empty()){
Node u = q.front(); q.pop();
if (u.x == n && u.y == m) return u.step;
for (int i = ; i < ; i++){
int x = u.x + py[i][];
int y = u.y + py[i][];
if (x > && x <= n && y > && y <= m)
if (map[u.x][u.y][x][y] == -) continue;
else if((map[u.x][u.y][x][y] == ) || ( << (map[u.x][u.y][x][y] - )) & u.state){
int states = u.state | key[x][y];
if (!vis[x][y][states]){
q.push((Node){x, y, u.step + , states});
vis[x][y][states] = ;
}
}
}
}
return -;
} int main(){
while(~scanf("%d %d %d",&n, &m, &p)){
scanf("%d", &t);
memset(map, , sizeof(map));
memset(key, , sizeof(key));
memset(vis, , sizeof(vis));
for (int i = ; i < t; i++){
int a, b, c, d, e;
scanf("%d %d %d %d %d", &a, &b, &c, &d, &e);
map[a][b][c][d] = map[c][d][a][b] = (e == )?-:e;
}
scanf("%d", &tt);
for (int i = ; i < tt; i++){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
key[a][b] |= ( << (c - ));
}
printf("%d\n", bfs());
}
return ;
}

「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)的更多相关文章

  1. HDU 3605:Escape(最大流+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...

  2. HDU 2809 God of War(DP + 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2809 题目大意:给出战神吕布的初始攻击力ATI.防御力DEF.生命值HP.每升一级增加的攻击力In_A ...

  3. hdu 4352 XHXJ's LIS 数位dp+状态压缩

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...

  4. HDU 5025 Saving Tang Monk 【状态压缩BFS】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...

  5. Solution -「HDU 6875」Yajilin

    \(\mathcal{Description}\)   Link.(HDU 裂开了先放个私链 awa.)   在一个 \(n\times n\) 的方格图中,格子 \((i,j)\) 有权值 \(w_ ...

  6. Solution -「HDU 5498」Tree

    \(\mathcal{Description}\)   link.   给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...

  7. 「HDU - 2857」Mirror and Light(点关于直线的对称点)

    题目链接 Mirror and Light 题意 一条直线代表镜子,一个入射光线上的点,一个反射光线上的点,求反射点.(都在一个二维平面内) 题解 找出入射光线关于镜子直线的对称点,然后和反射光线连边 ...

  8. 「 HDU P4734 」 F(x)

    # 题目大意 对于一个数 $x$,它的每一位数字分别是 $A_{n}A_{n-1}A_{n-2}\cdots A_{2}A_{1}$,定义其权重 $f(x)=\sum_{i=1}^{n}\left(A ...

  9. 「 HDU 1978 」 How many ways

    # 解题思路 记忆化搜索 一个点可以跳到的点,取决于它现在的能量.而且有一个显而易见的性质就是一条可行路径的终点和起点的横坐标之差加上纵坐标之差肯定小于等于起点的能量. 因为跳到一个点之后,能量和之前 ...

随机推荐

  1. Spark学习之路 (十)SparkCore的调优之Shuffle调优[转]

    概述 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO.序列化.网络数据传输等操作.因此,如果要让作业的性能更上一层楼,就有必要对shuffle过程进行调优 ...

  2. 嵊州D6T2 城市 city

    城市 city [问题描述] 众所周知,why 是czyz 王国的国王. czyz 王国一共有n 个城市,每个城市都有一条道路连向一个城市(可能连向这个城市自己). 同时,对于每一个城市,也只有一条道 ...

  3. Cows Of The Round Table【DFS】

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAz0AAAKiCAIAAABzTSUAAAAgAElEQVR4Aey9C5RnWVXff4GBUR6j8u ...

  4. jQuery中校验时间格式的正则表达式小结

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. 小白的java学习之路 “ 带参数的方法”

    一.带参数的方法: 1.1 语法: <访问修饰符> 返回类型 <方法名>(<形式参数列表>) { //方法的主体 } 1.2 案例: 榨汁机 public clas ...

  6. Windows2008r2、正版安装包

    最近发现有很多人找我要Windows  2008的安装包,为了方便,就分享在这儿一下,有需要的自行下载. 链接:https://pan.baidu.com/s/1YZFE7FxL8O_gtfAftcX ...

  7. SQLserver 数据类型转换

    1:CAST  方法 CAST(任何有效的表达试  AS 要转换的数据类型 [数据类型的长度,可选]) 例:SELECT  CAST(10000 as varchar(10)) SELECT  CAS ...

  8. vue 报错碰到的一些问题及其规范

    报错信息:Expected error to be handled(需要处理的错误) 这是因为回调函数里面的参数error没有运用到,所以可以不设置参数,或者在回调函数内console.log(err ...

  9. phpstorm实用技巧

    1.切换php代码版本提示 1.1找到External Libraries右键点击(configure PHP Include Paths) 1.2切换提示版本(在这里切换版本)确定即可 2.生成ge ...

  10. Selenium(Webdriver)自动化测试常问问题

    http://blog.sina.com.cn/s/blog_c189e2590102w3bv.html Selenium(Webdriver)自动化测试常问问题 (1)selenium中如何保证操作 ...