传送门:上海邀请赛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. ssh项目导入报the import javax.servlet cannot be resolved

    在做javaWeb项目时,我们经常会出现丢失包的情况,如下图所示的错误,我们应该怎么解决呢? 根据网上教程向工程中加入tomcat的servlet-api.jar和jsp-api.jar的包 此时项目 ...

  2. 笔记《精通css》第5章 链接应用样式

    第5章    链接应用样式 1.链接伪类选择器 a : link{    }   (寻找没有被访问过的链接) a : visied{    }(寻找被访问过的链接) 动态伪类选择器 a : hover ...

  3. Python3 每次处理一个字符

    """ Python3.4[文本]之每次处理一个字符 """ test_str = "my name is bixiaopeng& ...

  4. PHP基础知识测试题及解析

      本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A ) A:Windows系统 B:Apache服务器 C:MyS ...

  5. Books Queries (codeforces 1066C)

    模拟题 开一个容器进行模拟即可,注意容器设置初始大小不然容易re.设置两个指针l,r.把容器当作桶,每一个桶都有一个编号表示位置,左边进入那么就是编号为l,右边一样.然后l--或者r++,l=r=0的 ...

  6. pandas - 案例(美国2012年总统候选人政治献金数据分析)

    # 提供数据 months = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6, 'JUL' : 7, 'AUG' ...

  7. 关于python字符串format的一些花式用法

    目录: 基础 实战 前提: python中字符串的format功能非常强大,可以说完全能够替代其他的字符串使用方法,但是在后期的项目开发中使用的并不是特别的多, 以至于想用的时候会想不起来准确的使用方 ...

  8. 【codeforces 509B】Painting Pebbles

    [题目链接]:http://codeforces.com/contest/509/problem/B [题意] 给n鹅卵石染色; 有k种颜色可供选择; 问你有没有染色方案; 使得各个堆的鹅卵石里面,第 ...

  9. 【codeforces 514C】Watto and Mechanism(字典树做法)

    [题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...

  10. grafana简介

    grafana一般是和一些时间序列数据库进行配合来展示数据的,例如:Graphite.OpenTSDB.InfluxDB等 grafana是用于可视化大型测量数据的开源程序,他提供了强大和优雅的方式去 ...