首先关于分层图思想详见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. centos7安装显示中文

    系统通过环境变量LANG设置语言格式编码 查看当前语言环境 echo $LANG 查看是否安装中文语言,Linux中通过locale来设置程序运行的不同语言环境 locale -a | grep 'z ...

  2. PHP Files functions

    simple functions <?php $docRoot = $_SERVER['DOCUMENT_ROOT']; //readfile($docRoot."/orders/or ...

  3. C# LINQ学习笔记一:走进LINQ的世界

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介:     语言集成查询(LINQ)是Vi ...

  4. jQuery---prop方法和表格全选案例

    prop方法和表格全选案例 对于布尔类型的属性,不用attr方法,应该用prop方法 prop用法跟attr方法一样 <input type="button" value=& ...

  5. php 对象、json 、XML、数组互转

    对象转json $json=json_encode($postObj,JSON_FORCE_OBJECT); json转对象 $obj=json_encode($json); json转数组 $arr ...

  6. 假期学习【十】首都之窗百姓信件JavaWweb+Echarts图表展示

    今天主要对昨天爬取的数据进行处理,处理后用Echart图表展示, 效果如下:

  7. Codeforce 567A - Lineland Mail

    All cities of Lineland are located on the Ox coordinate axis. Thus, each city is associated with its ...

  8. BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树

    题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...

  9. BK: Data mining: concepts and techniques (1)

    Chapter 1 data mining is knowledge discovery from data; The knowledge discovery process is an iterat ...

  10. for循环与闭包

    Es5 function box(){ var arr = []; ;i<;i++){ arr[i] = (function(num){ //自我执行,并传参(将匿名函数形成一个表达式)(传递一 ...