hdu 5094 Maze bfs
传送门:上海邀请赛E
给定一个n×m的迷宫,给出相邻格子之间的墙或者门的信息,墙说明不可走,假设是门则须要有相应的钥匙才干通过,问是否可以从(1,1)到达(n,m)
一个带状态的bfs,再另记一个状态表示所带钥匙的种类,钥匙种类数最多仅仅有10,因此能够用位来表示钥匙的状态。
/******************************************************
* File Name: 5094.cpp
* Author: kojimai
* Create Time: 2014年11月03日 星期一 09时24分27秒
******************************************************/ #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define FFF 55
bool vis[FFF][FFF][2048];
int map[FFF][FFF],road[FFF][FFF][4];
int move[4][2] ={-1,0,0,1,1,0,0,-1};//0-up 1-right 2-down 3-left
struct node
{
int x,y,t,key;
}now,tmp;
queue<node> pp; int getg(int g)
{
if(g == 0)
return -1;
else
return 1 << g;
}
void solve(int x1,int y1,int x2,int y2,int g)
{
if(x1 == x2)
{
if(y1<y2)
{
road[x1][y1][1] = getg(g);
road[x2][y2][3] = getg(g);
}
else
{
road[x1][y1][3] = getg(g);
road[x2][y2][1] = getg(g);
}
}
else if(x1 < x2)
{
road[x1][y1][2] = getg(g);
road[x2][y2][0] = getg(g);
}
else
{
road[x1][y1][0] = getg(g);
road[x2][y2][2] = getg(g);
}
return;
}
bool judge(int dir)
{
if(road[now.x][now.y][dir] == -1)
return false;
if(road[now.x][now.y][dir] == 0)
return true;
if((road[now.x][now.y][dir] & now.key) == 0)
return false;
else
return true;
}
void printr()
{
for(int k = 0;k <= 3;k++)
{
cout<<" "<<k<<endl;
for(int i = 1;i <= 4;i++)
{
for(int j = 1;j <= 4;j++)
{
cout<<road[i][j][k]<<' ';
}
cout<<endl;
}
}
}
void printm()
{
for(int i = 1;i <= 4;i++)
{
for(int j = 1;j <= 4;j++)
{
cout<<map[i][j]<<' ';
}
cout<<endl;
}
} int main()
{
int n,m,p,s,x1,x2,y1,y2,g,k,key;
while(~scanf("%d",&n))
{
while(!pp.empty()) pp.pop();
scanf("%d%d",&m,&p);
scanf("%d",&k);
memset(map,0,sizeof(map));
memset(road,0,sizeof(road));
while(k--)
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&g);
solve(x1,y1,x2,y2,g);
}
scanf("%d",&s);
while(s--)
{
scanf("%d%d%d",&x1,&y1,&key);
map[x1][y1] |= (1<<key);
}
memset(vis,false,sizeof(vis));
int ans = -1;
now.x = 1;now.y = 1;now.key = map[1][1];now.t = 0;
vis[1][1][now.key] = true;
pp.push(now);
//printr();
//printm();
while(!pp.empty())
{
now = pp.front();pp.pop();
//cout<<" x = "<<now.x<<" y = "<<now.y<<" t = "<<now.t<<" key = "<<now.key<<endl;
if(now.x == n&&now.y == m)
{
ans = now.t;
break;
}
tmp.t = now.t + 1;
int xx,yy;
for(int i = 0;i < 4;i++)
{
if(judge(i))
{
xx = now.x + move[i][0];
yy = now.y + move[i][1];
if(xx <= 0 || xx > n || yy <= 0 || yy > m)
continue;
else
{
tmp.key = now.key | map[xx][yy];
tmp.x = xx;
tmp.y = yy;
if(!vis[tmp.x][tmp.y][tmp.key])
{
vis[tmp.x][tmp.y][tmp.key] = true;
pp.push(tmp);
}
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
hdu 5094 Maze bfs的更多相关文章
- 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 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- HDU 5094 --Maze【BFS && 状态压缩】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- HDU - 5094 Maze(状压+bfs)
Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...
- HDU 5094 Maze (状压)
加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...
- hdu 5094 Maze(水搜索)
题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...
- hdu 5094 状压bfs+深坑
http://acm.hdu.edu.cn/showproblem.php?pid=5094 给出n*m矩阵 给出k个障碍,两坐标之间存在墙或门,门最多10种,状压可搞 给出s个钥匙位置及编号,相应的 ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- HDU 5094 题解(状压BFS)
题面: Maze 题目中文大意: 这个故事发生在“星际迷航”的背景下. “星际争霸”的副队长史波克落入克林贡的诡计中,被关押在他们的母亲星球Qo’noS上. 企业的上尉詹姆斯·T·柯克(James T ...
随机推荐
- 2 我们的C#学习方法
在这里我们借鉴了一种行之有效的学习编程语言的方法,并在此基础上进行了相应的改良.我们在培训新人中使用后,发现这种学习方法是非常有效的. 你通过做以下几个步骤来一步步学习C#语言. 1. 搞懂每一个我们 ...
- 实现div毛玻璃背景
毛玻璃效果 ios里毛玻璃效果的使用非常多,本文介绍一个实现div毛玻璃背景的方法 CSS3 Filter CSS3的Filter主要用在图像的特效处理上,默认值为none,还有以下备选项: 1. ...
- PHP开发之旅-验证码功能实现
验证码这样的功能可以说是无处不在了,接下来使用php来实现验证码这样的功能,这里我是将验证码实现抽取到一个类中独立开来,那么后面如果再使用到验证码功能,直接引入该类文件并创建该类的实例,就可以使用验证 ...
- 我的liunx开发环境的配置之路
相信有不少人和我一样,虽然是做纯linux开发,但并不排斥windows,并且喜欢在windows下面的使用各种好用的工具来让linux的编程工作变得更加方便.实际上每一个系统都有他的过人支持,win ...
- SQLServer 异常捕获,回滚,再抛出
一个存储过程中多个更新操作,后面的更新操作出现异常,如果不手动回滚前面修改的数据是不会自动撤销的! BEGIN TRY BEGIN TRAN -- ..... COMMIT TRAN END TRY ...
- dubbo之配置规则
配置规则 向注册中心写入动态配置覆盖规则 1.该功能通常由监控中心或治理中心的页面完成. RegistryFactory registryFactory = ExtensionLoader.getEx ...
- 关于react框架的一些细节问题的思考
目录 setState到底是同步的还是异步的? 如何在子组件中改变父组件的state? context的运用,避免“props传递地狱” 组件类里有私有变量a,它到底改放在this.a中还是this. ...
- CAD读取属性块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Nodejs介绍及其安装
一.Nodejs介绍 Nodejs英文网:https://nodejs.org/en/ Nodejs中文网:http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 ...
- 20170704-WNDR4300uboot help info
Unknown command 'env' - try 'help'ar7240> help? - alias for 'help'base - print or set address off ...