首先关于分层图思想详见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. select count(1)和select count(*)的区别

    select count(1) from 表a //查询时会对常数列进行统计行数select count(*) from 表a //查询时会找表a中最短的列进行统计行数 因为使用count(*)查询会 ...

  2. 2019kali中文乱码

    1.安装KALI2019.4版本后会出现乱码问题 2.更新国内源,使用vim编辑器修改:vim /etc/apt/sources.list添加 #清华大学 [更新源]    deb https://m ...

  3. PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)

    给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

  4. 获取URL地址参数方法

    //获取url参数 getQueryVariable(variable){ var query =decodeURIComponent(window.location.search.substring ...

  5. 看完它,你就全懂了十大Wifi芯片原厂!

    看完它,你就全懂了十大Wifi芯片原厂!   来源:全球物联网观察 概要:不知不觉中,WiFi几乎已攻占了整个世界.现在只要你上网,可能就离不开WiFi了. 2014年是物联网WiFi市场关键的转折期 ...

  6. UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 45: illegal multibyte sequence

    常见的一种解码错误如题目所示,下面介绍该错误的解决方法 (1).首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’, encoding=’gbk’): (2).若(1)不能解决,可能是 ...

  7. Codeforce 230A - Dragons (sort)

    Kirito is stuck on a level of the MMORPG he is playing now. To move on in the game, he's got to defe ...

  8. [TJOI2013] 奖学金 - 堆

    按 a 排序,暴力用堆维护两侧预处理, 然后枚举中位数即可 #include <bits/stdc++.h> using namespace std; #define int long l ...

  9. windows ltsc版本没有Microsoft Store怎么解决

      [背景]以前一直都是使用windows的企业版,后来发现ltsc版本更好,这个好处在这里就不多说,懂的人自然会懂.但是发现很多应用都没有,包括Microsoft Store商店都没有.下面就是解决 ...

  10. java中锁与@Transactional同时使用导致锁失效的问题

    示例代码 @Transactional public void update(int id) { boolean lock = redisLock.lock(id); if (!lock) { thr ...