HDU 5094 Maze (状压)
加一个维度,钥匙的状态,状压一下。n很小,钥匙也只有10个,bfs就好了。
忘了数组初始化。以后坚决不犯这种低级错误。
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = +;
int g[maxn][maxn][];
int k[maxn][maxn];
int dx[] = {,-,,};
int dy[] = {,,,-};
int dir[] = { ,,-,, }; struct node
{
int x,y,step;
int s;
node(int X = , int Y = ,int S = ,int Step = ) {
x = X; y =Y; s = S; step = Step;
}
};
int n,m,p;
bool vis[maxn][maxn][+];
queue<node> q;
int tx,ty; int bfs()
{
memset(vis,,sizeof(vis));
while(q.size()) q.pop();
node u(,,k[][],);
q.push(u);
while(q.size()){
u = q.front();q.pop();
if(u.x == tx && u.y == ty) {return u.step;}
for(int i = ; i < ; i++){
if( g[u.x][u.y][i] == - || u.s&(<<g[u.x][u.y][i])){
int nx = u.x+dx[i], ny = u.y+dy[i], ns = u.s|k[nx][ny];
if(<=nx&&nx<=n&&<=ny&&ny<=m&&!vis[nx][ny][ns>>]){
vis[nx][ny][ns>>] = ;
q.push(node(nx,ny,ns,u.step+));//+(g[u.x][u.y][i]!=-1)
}
}
}
}
return -;
} int main()
{
//freopen("E_in.txt","r",stdin);
//freopen("E_out.txt","w",stdout);
while(scanf("%d%d%d",&n,&m,&p) == ){
int K;
scanf("%d",&K);
memset(g,-,sizeof(g));
for(int i = ; i < K; i++){
int x1,x2,y1,y2,tp;
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&tp);
int Dir = dir[((y2-y1+)<<)+x2-x1];
g[x1][y1][Dir] = tp;
g[x2][y2][Dir^] = tp;
}
int S;
memset(k,,sizeof(k));
scanf("%d",&S);
for(int i = ; i < S; i++){
int x0,y0,tp;
scanf("%d%d%d",&x0,&y0,&tp);
if(tp)
k[x0][y0] |= <<tp;
}
tx = n; ty = m;
int ans = bfs();
printf("%d\n",ans);
}
return ;
}
HDU 5094 Maze (状压)的更多相关文章
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...
- HDU 4284Travel(状压DP)
HDU 4284 Travel 有N个城市,M条边和H个这个人(PP)必须要去的城市,在每个城市里他都必须要“打工”,打工需要花费Di,可以挣到Ci,每条边有一个花费,现在求PP可不可以从起点1 ...
- hdu 2209 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...
- hdu 5025 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- 拯救大兵瑞恩 HDU - 4845(状压bfs || 分层最短路)
1.状压bfs 这个状压体现在key上 我i们用把key状压一下 就能记录到一个点时 已经拥有的key的种类 ban[x1][y1][x2][y1]记录两个点之间的状态 是门 还是墙 还是啥都没有 ...
- HDU - 5117 Fluorescent(状压dp+思维)
原题链接 题意 有N个灯和M个开关,每个开关控制着一些灯,如果按下某个开关,就会让对应的灯切换状态:问在每个开关按下与否的一共2^m情况下,每种状态下亮灯的个数的立方的和. 思路1.首先注意到N< ...
- hdu 1429 bfs+状压
题意:这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开始 Ignatius被关在(sx,sy)的位置,离开地牢的门 ...
随机推荐
- iOS ipa包重签名
背景:公司做游戏SDK的,提供SDK给第三方后,他们打包过来我们需要分发在不同的渠道,这个时候需要修改SDK的配置文件,ipa文件修改后是需要手机越狱或者ipa重签名才能安装成功的,所以研究了一下重签 ...
- UIButton和UINavigationItem设置图片和文字位置
1.UIButton设置文字位置 有些时候我们想让UIButton的title居左对齐,我们设置 btn.textLabel.textAlignment = UITextAlignmentLeft 是 ...
- python3登陆接口测试
Python3和Python2有很大的语法区别,在实际的项目中,要注意格式.今天用Python3做一个接口测试,由于没有经验,用Python2的语法,调了半天没有搞定,后来一个大神指点了一下,终于拨开 ...
- ue4 htcvivi简单配置
1 主角视口:相机与控制器挂载 Chaperone设置,主角bp上加上SteamVRChaperone用于提示用户可用区域边界 MotionController1里面选项设置为Right右手,然后下边 ...
- 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows
P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...
- InnoDB Monitors | SHOW ENGINE INNODB STATUS
参考 <mysql 5.7手册>,15.17章节 InnoDB监视器提供有关InnoDB内部状态的信息. 这些信息对于性能调优非常有用.其实所谓的监视器,就是 show engine in ...
- 剑指Offer的学习笔记(C#篇)-- 序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...
- css3中-moz、-ms、-webkit、-o
-moz代表firefox浏览器私有属性-ms代表IE浏览器私有属性-webkit代表chrome.safari私有属性-o代表opera私有属性
- JSON 返回值JSONPath Syntax
{"sys":"ROC","code":0,"messages":"获取列表成功!","d ...
- Java基础学习_01 概述及环境配置
一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...