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)的位置,离开地牢的门 ...
随机推荐
- Android开发中,那些让你觉得相见恨晚的方法、类或接口
Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...
- sql中的高级编程(函数,存储过程,视图)
一.函数:用sql写一个函数,调用这个函数,返回一张数据表table CREATE FUNCTION FunName ( ) RETURNS @TempTable table ( roleid int ...
- svn git 的区别(别再问我了)
这篇主要是谈谈两者的区别,至于谁优谁劣看官自己思考吧! 把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点 ...
- window.onerror 捕捉所有的前端error
//[捕捉所有前端error] window.onerror = function (errormessage, url, line, column, error) { console.log(&qu ...
- MySQL生成UUID
UUID函数 在MySQL中,可以用uuid()函数来生成一个UUID,如下图: replace函数 默认生成的uuid含有'-',我们可以使用replace函数替换掉'-',SQL如下: selec ...
- 基于canvas绘图 缩放 做标记
技术要点: 1.img 绘制到canvas 2.绘制完成以后进行拖拽,缩放 3.使用canvas画图,在绘制的img上进行标记划线,当然可以实现跟过功能,例如百度地图的功能,做单个标记,区域标记等. ...
- IDEA 小技巧之书签与收藏
原文地址:IDEA 小技巧之书签与收藏 最近翻阅 Spring 源码,由于源码调用链路很长,等看了十几类方法之后,想看前面调用方法就很不方便,需要查找历史的查看记录.还有时候看着看着就忘了中间某个方法 ...
- POJ 2411 Mondriaan's Dream 【状压Dp】 By cellur925
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可 ...
- 福昕阅读器把pdf某一页保存出来
第一步: 第二步: 第三步: 第四步:点击保存即可
- 自定义view(14)使用Path绘制复杂图形
灵活使用 Path ,可以画出复杂图形,就像美术生在画板上画复杂图形一样.程序员也可以用代码实现. 1.样板图片 这个是个温度计,它是静态的,温度值是动态变化的,所以要自定义个view.动态显示值,温 ...