传送门:上海邀请赛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的更多相关文章

  1. hdu 5094 Maze (BFS+状压)

    题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi ...

  2. hdu 5094 Maze 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...

  3. HDU 5094 --Maze【BFS &amp;&amp; 状态压缩】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  4. HDU - 5094 Maze(状压+bfs)

    Maze This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enter ...

  5. HDU 5094 Maze (状压)

    加一个维度,钥匙的状态,状压一下.n很小,钥匙也只有10个,bfs就好了. 忘了数组初始化.以后坚决不犯这种低级错误. #include<cstdio> #include<queue ...

  6. hdu 5094 Maze(水搜索)

    题目意思:说有一个人在(1,1) 他的目标点在(n,m) 每次是4方向的移动: 限制条件:有的各自之间有墙 或者门,强不可通过,有对应的要钥匙可以开启这个类型的所有门: 问题:求最少步骤数(和): 类 ...

  7. hdu 5094 状压bfs+深坑

    http://acm.hdu.edu.cn/showproblem.php?pid=5094 给出n*m矩阵 给出k个障碍,两坐标之间存在墙或门,门最多10种,状压可搞 给出s个钥匙位置及编号,相应的 ...

  8. hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Sub ...

  9. HDU 5094 题解(状压BFS)

    题面: Maze 题目中文大意: 这个故事发生在“星际迷航”的背景下. “星际争霸”的副队长史波克落入克林贡的诡计中,被关押在他们的母亲星球Qo’noS上. 企业的上尉詹姆斯·T·柯克(James T ...

随机推荐

  1. 【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  2. DeltaFish 校园物资共享平台 第七次小组会议

    DeltaFish 校园物资共享平台 第七次小组会议 一.上周进度报告 前端 娄:和李一起建立前后端交互参数文档,和数据库文档,完成前端页面跳转和图片加载的 bug,Git 上去. 刘:优化前端 ab ...

  3. 设计模式——“signleton”

    那天别人问了我一个问题,关于单例模式的,由于之前了解的都是蜻蜓点水,所以重新复习了一次重新总结. 单例模式的写法总的来说有5种:懒汉,恶汉,枚举,双重校验锁,静态内部类 懒汉 public class ...

  4. HashMap , TreeMap , TreeMap 默认排序

    Java代码  import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java. ...

  5. html5——过渡

    transition:1.开始状态   2.终止状态    3.过渡属性 transition: width 2s, background-color 2s;//属性,时间 transition: a ...

  6. 【sqli-labs】 less48 GET -Error based -Blind -Numeric -Order By Clause(GET型基于盲注的整型Order By从句注入)

    图片还是47...访问的的确是48 这个是基于bool的盲注 http://192.168.136.128/sqli-labs-master/Less-48/?sort=1 and sleep(0.1 ...

  7. ARX中类型强制转换

    比如 克隆 clone, 获得的是一个acrxobject, acrxobject *pobj=pployline->clone(); acdbpolyline *ppoly=acdbpolyl ...

  8. Oracle行转列/列转行

    1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ,'成都市' city,'第一' ranking from dual u ...

  9. ZOJ 3180 Number Game(模拟,倒推)

    题目 思路: 先倒推!到最后第二步,然后: 初始状态不一定满足这个状态.所以我们要先从初始状态构造出它出发的三种状态.那这三种状态跟倒推得到的状态比较即可. #include<stdio.h&g ...

  10. 2.5.3 简单的 echo 输出

        echo的任务就是产生输出,可用来提示用户,或是用来产生数据供进一步处理.       原始的echo命令只会将参数打印到标准输出,参数之间以一个空格隔开,并以换行符号(newline)结尾. ...