传送门:上海邀请赛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;elsereturn 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;elsereturn 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;
}

转载于:https://www.cnblogs.com/wzzkaifa/p/6970194.html

hdu 5094 Maze bfs相关推荐

  1. hdu 5094 Maze

    题意: n*m大的迷宫 ,有p种钥匙.钥匙最多有10种. 然后一个k,然后k行表示 (x1,y1),(x2,y2)直接有门或者墙. 如果g==0 ,就是有墙, 如果g>0 表示有门,且门需要第g ...

  2. 【HDU - 5094】 Maze (状态压缩+bfs)

    题干: This story happened on the background of Star Trek. Spock, the deputy captain of Starship Enterp ...

  3. hdu - 1072 Nightmare(bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...

  4. HDU 1242 Rescue BFS+优先队列

    题目链接:点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1242 #include <stdio.h> #include <stri ...

  5. HDU - 1043 Eight(bfs打表)

    题目链接:点击查看 题目大意:八数码经典问题,给出一个3*3的矩阵,其中随机分布着1~8的数字以及一个空位(我们用x来表示空位),在整个矩阵中,每一次操作都可以将x和他附近的方块互换,问经过多少次操作 ...

  6. HDU 4035 Maze

    Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...

  7. hdu 1241Oil Deposits(BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241 Oil Deposits Time Limit: 2000/1000 MS (Java/Othe ...

  8. HDU3713 Double Maze(BFS)

    题目链接: https://cn.vjudge.net/problem/18676/origin Problem Description Unlike single maze, double maze ...

  9. hdu 1240(三维bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1240 思路:就是一个简单的bfs,但我搞了好久啊,有一个trick一直没注意到,然后第二组数据就一直过 ...

最新文章

  1. Python学习之使用Python生成PDF报告
  2. 关闭VMware 不用的服务
  3. OneNET微信平台授课笔记
  4. 左神算法:调整搜索二叉树中两个错误的节点(Java版)
  5. 如何使用SAP Gigya的登录服务和您的网站集成
  6. python像素处理_Python+OpenCV图像处理(五)—— 像素运算
  7. 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
  8. SWT多线程注意事项
  9. TransE:Translating Embedding多元关系数据嵌入(知识图谱嵌入)2013 NIPS
  10. 深度优先搜索——单词方阵(洛谷 P1101)
  11. HTML5前端开发真的会被取代吗?
  12. jabc spring
  13. HDU-1150 Machine Schedule 二分图匹配
  14. 力软敏捷开发框架7.0.6源码
  15. 对路径“C:\Program Files (x86)\gwssi\CPC客户端\CheckWord.xml”的访问被拒绝。
  16. Python黑科技神奇去除马赛克
  17. win7 install solution for intel SKL and BSW platform
  18. Keras中的verbose参数
  19. 在VM虚拟机上安装Red Hat Enterprise Linux
  20. (SEED-Lab) Sniffing_Spoofing

热门文章

  1. 美团信用卡现金分期怎么还?
  2. 开菜鸟驿站需要什么条件?投入成本大概要多少?
  3. 老年人学摄影,装备该如何选择?
  4. 中小卖家需要避开的三个坑
  5. 发展前景好的互联网技术方面,你觉得比较适合女孩子的都有哪些啊?
  6. It is worth noting that among the four
  7. 分布式理论(3):Paxos Made Simple
  8. Golang学习 - sync 包
  9. MyBatis实现模糊查询的三种方式
  10. t–sql pl–sql_T-SQL for DBA –使用T-SQL进行快速数据分析的三种方法