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)的位置,离开地牢的门 ...
随机推荐
- CMD运行指令
CMD运行指令 开始→运行→CMD→键入以下命令即可: gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explo ...
- 在 Ubuntu 上安装 Protobuf 3
什么时候需要安装 如果使用 protoc 命令,遇到 Protoc not found,表示未安装.或者,执行时出现错误:This parser only recognizes "proto ...
- 网络应用(6):http报文结构与curl的使用
http是一个协议,协议就是约定.规定,先不管为什么这么约定有什么高深的东西,为了解决具体问题,我们先要能使用协议,理解协议中对我们有用的那部分数据,是的,我们不是研究生,更不是纯研究,所有的研究都要 ...
- Swoole HTTP 的应用
目录 概述 代码 小结 扩展 概述 这是关于 Swoole 学习的第四篇文章:Swoole HTTP 的应用. 第三篇:Swoole WebSocket 的应用 第二篇:Swoole Task 的应用 ...
- Unity3D 自动添加Fbx Animation Event
http://blog.csdn.net/aa20274270/article/details/52528449 using UnityEngine; using System.Collections ...
- 洛谷P2414 [NOI2011]阿狸的打字机(AC自动机)
传送门 考虑一下,如果串B在串A中出现过,那么A的fail指针必定直接或间接指向B 那么我们可以把fail树建起来,那么就变成B代表的节点的子树里有多少节点属于A 然后这就是一个序列统计问题,直接用d ...
- 「BZOJ2127」happiness(最小割)
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- Java基础--常用API--字符串相关API
一.java.lang.String 1.string对象不可变,被final修饰,不能被继承. 2.赋值方式: (1)直接赋值.比如: String name = "rick"; ...
- Corn Fields(模板)
题目链接 #include <stdio.h> #include <algorithm> #include <string.h> #include <iost ...
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...