hdu 5094 Maze bfs
来源:互联网 发布:帝王蟹上岸要杀死知乎 编辑:程序博客网 时间:2024/05/29 16:54
传送门:上海邀请赛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 55bool 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-leftstruct 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;}
0 0
- hdu 5094 Maze bfs
- hdu 5094 Maze(BFS)
- Hdu 5094 Maze(状压dp+bfs)
- hdu 5094 Maze (bfs+状态压缩)
- [HDU]5094Maze(状态压缩BFS)
- HDU 5094 Maze(BFS、状态压缩)
- hdu 5094 Maze bfs+状态压缩
- HDU 5094 --Maze【BFS && 状态压缩】
- hdu 5091 Maze (bfs+状态压缩)
- HDU-3713:Double Maze(双重BFS)
- HDU 5094 Maze & HDU 4845 拯救大兵瑞恩 (BFS + 状压)
- HDU 5094 Maze
- HDU 5094 Maze
- HDU 5094 Maze
- hdu 5094 Maze
- HDOJ 题目5094 Maze(BFS+状压)
- HDOJ 5094 Maze 【状态压缩+BFS】
- hdu 3713 Double Maze(四维的BFS)
- java的反射机制
- 开博了
- IOS之 UIview中的坐标转化
- imageview开发中经常使用的功能-裁剪和适合屏幕-打开系统的图片库
- 精益创业的五项原则
- hdu 5094 Maze bfs
- LeetCode Pascal's Triangle
- Struts2 拦截器
- 2的N次方是多少位数
- 为什么新创企业以惨败告终的情况比比皆是?
- int转化为char输出
- mysql基础
- 思考
- 张孝祥老师java课程_子类对象的实例化过程