hdu4845 状态压缩BFS
题意:
给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm.
思路:
哎!一眼就看出来了是个状态压缩搜索的水题,结果wa了将近两个小时,就是因为忽略了一个点可能有多把钥匙,回来说下这个题,我们可以开一个数组mark[x][y][key],表示当前的这个点xy所含有的钥匙状态是key的时候是否走过,key是一个二进制压缩的数,这个很简单不解释,同时在开一个数组bnk[x1][y1][x2][y2]记录从x1y1到点x2y2的中间是什么东西(墙,门,或者什么都没有),然后就是遍历就行了,题目一点不难,还不明白的直接看代码就知道了。
#include<stdio.h>
#include<string.h>
#include<queue> #define N 20
using namespace std; typedef struct
{
int x ,y ,t ,key;
}NODE; NODE xin ,tou;
int mark[N][N][1<<10+1];
int bank[N][N][N][N];
int map[N][N];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0}; int BFS(int n ,int m)
{
memset(mark ,0 ,sizeof(mark));
xin.x = xin.y = 1;
xin.t = 0;
xin.key = 0 | map[1][1];
mark[xin.x][xin.y][xin.key] = 1;
queue<NODE>q;
q.push(xin);
while(!q.empty())
{
tou = q.front();
q.pop();
for(int i = 0 ;i < 4 ;i ++)
{
xin.x = tou.x + dir[i][0];
xin.y = tou.y + dir[i][1];
xin.t = tou.t + 1;
if(xin.x < 1 || xin.x > n || xin.y < 1 || xin.y > m)
continue;
if(!bank[tou.x][tou.y][xin.x][xin.y])
continue;
if(bank[tou.x][tou.y][xin.x][xin.y] == -1 || tou.key & (1 << (bank[tou.x][tou.y][xin.x][xin.y] - 1)))
{
if(!map[xin.x][xin.y]) xin.key = tou.key;
else xin.key = tou.key | map[xin.x][xin.y];
if(!mark[xin.x][xin.y][xin.key])
{
mark[xin.x][xin.y][xin.key] = 1;
q.push(xin);
if(xin.x == n && xin.y == m)
return xin.t; }
}
}
}
return -1;
} int main ()
{
int n ,m ,p ,k ,q ,i;
int x1 ,x2 ,y1 ,y2 ,key;
while(~scanf("%d %d %d" ,&n ,&m ,&p))
{
scanf("%d" ,&k);
memset(bank ,255 ,sizeof(bank));
for(i = 1 ;i <= k ;i ++)
{
scanf("%d %d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2 ,&key);
bank[x1][y1][x2][y2] = bank[x2][y2][x1][y1] = key;
}
scanf("%d" ,&q);
memset(map ,0 ,sizeof(map));
for(i = 1 ;i <= q ;i ++)
{
scanf("%d %d %d" ,&x1 ,&y1 ,&key);
map[x1][y1] |= (1 << (key - 1));
}
printf("%d\n" ,BFS(n ,m));
}
return 0;
}
hdu4845 状态压缩BFS的更多相关文章
- 胜利大逃亡(续)(状态压缩bfs)
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 3681 Prison Break(状态压缩+bfs)
Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...
- 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- 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 ...
- POJ - 1324 Holedox Moving (状态压缩+BFS/A*)
题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...
- POJ 3411 Paid Roads (状态压缩+BFS)
题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...
- 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)
首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...
- [HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)
快要THUSC了,来水几道模板题吧. 这题其实是AC自动机模板.看到长度最短,首先就想到AC自动机.那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把 ...
随机推荐
- POJ-3281(最大流+EK算法)
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...
- Java-for循环打印九九乘法表
Java打印九九乘法表 public class forDemo04 { public static void main(String[] args) { //练习3:打印九九乘法表 /* 1*1=1 ...
- 普通的一天,说一个普通的XML
什么是XML XML全称是Extensible Markup Language,译为"可扩展标记语言",常用来存储和传输信息. XML的结构 我们经常看到的XML文件是这个样子的: ...
- JAVA -JSON-XML-MAP转换
//定义一个MAP对象,将对象传给后端接口接收 Map a = ["api": '11', ZGUID: "1231",BESKZ: "1231& ...
- Educational Codeforces Round 98 (Rated for Div. 2)
A 如果\(n = m\),答案为\(2 \times n\):如果\(n \ne m\),答案为\(2 \times max(n,m) - 1\) #include <bits/stdc++. ...
- Django之模版层
一.模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别,也就是说,HTML被直接硬编码在python代码之中. def current_datetime(request): now = ...
- 通过 Battery Historian 工具分析 Android APP 耗电情况
电量统计模块概述 Android 从两个层面统计电量的消耗,分别为 软件排行榜 及 硬件排行榜.它们各有自己的耗电榜单,软件排行榜为机器中每个 App 的耗电榜单,硬件排行榜则为各个硬件的耗电榜单.这 ...
- 【wp】2021V&NCTF
前几天打完的V&NCTF公开赛,做题的时候没记过程,这是复现wp. 最后排名Top 18,三道RE+两道杂项(wp没啥可放的hhh)+一道web,感觉re题目还是挺好的,难度适中点赞,尤其pc ...
- SQL注入与参数化查询
SQL注入的本质 SQL注入的实质就是通过SQL拼接字符串追加命令,导致SQL的语义发生了变化.为什么发生了改变呢? 因为没有重用以前的执行计划,而是对注入后的SQL语句重新编译,然后重新执行了语法解 ...
- python3 循环位移动
python3 中 >> 为算术右移位,高位补符号位: <<为左移位,低位补0: 1 # 假如将一个无符号的数据val,长度为N,需要循环移动n位.可以利用下面的公式: 2 ...