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 ...
随机推荐
- Laravel5.1学习笔记16 数据库2 查询构造器(这个不用看,不如用EloquentORM)
Introduction Retrieving Results Aggregates Selects Joins Unions Where Clauses Advanced Where Clauses ...
- centos7下手动制作trove镜像
获取镜像 [root@bldattet1 ~]# wget http://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64 ...
- CSS——行高
浏览器默认文字大小:16px 行高:是基线与基线之间的距离 行高=文字高度+上下边距 一行文字行高和父元素高度一致的时候,垂直居中显示. <!DOCTYPE html> <html& ...
- [Windows Server 2003] 还原SQL Server数据库
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...
- 打造最强NGINX HTTPS
SSL LABS 检测 完整配置如下 server { listen 443 ssl; server_name xxx.xxxke.com; ssl on; ssl_certificate /xxx/ ...
- iic通讯 FPGA实现 mpu6050为例
IIC最常用的通讯协议,但普遍用于单片机.arm这些,用FPGA实现大材小用,但对于菜鸡水平练练手很不错,考验串并转换和时序的控制.今天我就以mpu6050陀螺仪为例,实现FPGA的iic通信. 1. ...
- 图表实现基于SVG或Canvas
Highcharts 基于SVG,方便自己定制,但图表类型有限. Echarts 基于Canvas,适用于数据量比较大的情况. D3.v3 基于SVG,方便自己定制:D3.v4支持Canvas+SVG ...
- 15.6.2【Task使用】 组合异步操作
对于C# 5异步特性,我最喜欢的一点是它可以自然而然地组合在一起.这表现为两种不同的 方式.最明显的是,异步方法返回任务,并通常会调用其他返回任务的方法.这些方法可以是直 接的异步操作(如链的最底部) ...
- 【解题报告】 Leapin' Lizards HDU 2732 网络流
[解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...
- 7-20 Windows消息队列 (25 分)(模拟水题)
题意: 思路: 用优先队列直接模拟就OK了,另外优先队列存pair的时候比较的是first的值,实测!! 上代码: #include <iostream> #include <que ...