hdu 4845 拯救大兵瑞恩(bfs)
来源:互联网 发布:安静苦笑淘宝店 编辑:程序博客网 时间:2024/04/28 08:21
拯救大兵瑞恩
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 51 Accepted Submission(s): 13
Problem Description
1944年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里,迷宫地形复杂,但是幸好麦克得到了迷宫的地形图。
迷宫的外形是一个长方形,其在南北方向被划分为N行,在东西方向被划分为M列,于是整个迷宫被划分为N*M个单元。我们用一个有序数对(单元的行号,单元的列号)来表示单元位置。南北或东西方向相邻的两个单元之间可以互通,或者存在一扇锁着的门,又或者存在一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所有的门被分为P类,打开同一类的门的钥匙相同,打开不同类的门的钥匙不同。
大兵瑞恩被关押在迷宫的东南角,即(N,M)单元里,并已经昏迷。迷宫只有一个入口,在西北角,也就是说,麦克可以直接进入(1,1)单元。另外,麦克从一个单元移动到另一个相邻单元的时间为1,拿取所在单元的钥匙的时间以及用钥匙开门的时间忽略不计。
你的任务是帮助麦克以最快的方式抵达瑞恩所在单元,营救大兵瑞恩。
迷宫的外形是一个长方形,其在南北方向被划分为N行,在东西方向被划分为M列,于是整个迷宫被划分为N*M个单元。我们用一个有序数对(单元的行号,单元的列号)来表示单元位置。南北或东西方向相邻的两个单元之间可以互通,或者存在一扇锁着的门,又或者存在一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所有的门被分为P类,打开同一类的门的钥匙相同,打开不同类的门的钥匙不同。
大兵瑞恩被关押在迷宫的东南角,即(N,M)单元里,并已经昏迷。迷宫只有一个入口,在西北角,也就是说,麦克可以直接进入(1,1)单元。另外,麦克从一个单元移动到另一个相邻单元的时间为1,拿取所在单元的钥匙的时间以及用钥匙开门的时间忽略不计。
你的任务是帮助麦克以最快的方式抵达瑞恩所在单元,营救大兵瑞恩。
Input
有多组数据对于每一组数据来说:
第一行是三个整数,依次表示N,M,P的值;
第二行是一个整数K,表示迷宫中门和墙的总个数;
第I+2行(1<=I<=K),有5个整数,依次为Xi1,Yi1,Xi2,Yi2,Gi:
当Gi>=1时,表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一扇第Gi类的门,当Gi=0时,表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一堵不可逾越的墙;
(其中,|Xi1-Xi2|+|Yi1-Yi2|=1,0<=Gi<=P)
第K+3行是一个整数S,表示迷宫中存放的钥匙总数;
第K+3+J行(1<=J<=S),有3个整数,依次为Xi1,Yi1,Qi:表示第J把钥匙存放在(Xi1,Yi1)单元里,并且第J把钥匙是用来开启第Qi类门的。(其中1<=Qi<=P)
注意:输入数据中同一行各相邻整数之间用一个空格分隔。
参数设定:
3<=N,M<=15;
1<=P<=10;
第一行是三个整数,依次表示N,M,P的值;
第二行是一个整数K,表示迷宫中门和墙的总个数;
第I+2行(1<=I<=K),有5个整数,依次为Xi1,Yi1,Xi2,Yi2,Gi:
当Gi>=1时,表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一扇第Gi类的门,当Gi=0时,表示(Xi1,Yi1)单元与(Xi2,Yi2)单元之间有一堵不可逾越的墙;
(其中,|Xi1-Xi2|+|Yi1-Yi2|=1,0<=Gi<=P)
第K+3行是一个整数S,表示迷宫中存放的钥匙总数;
第K+3+J行(1<=J<=S),有3个整数,依次为Xi1,Yi1,Qi:表示第J把钥匙存放在(Xi1,Yi1)单元里,并且第J把钥匙是用来开启第Qi类门的。(其中1<=Qi<=P)
注意:输入数据中同一行各相邻整数之间用一个空格分隔。
参数设定:
3<=N,M<=15;
1<=P<=10;
Output
对于每一组数据,输出一行,只包含一个整数T,表示麦克营救到大兵瑞恩的最短时间的值,若不存在可行的营救方案则输出-1。
Sample Input
4 4 991 2 1 3 21 2 2 2 02 1 2 2 02 1 3 1 02 3 3 3 02 4 3 4 13 2 3 3 03 3 4 3 04 3 4 4 022 1 24 2 1
Sample Output
14vis[20][20][2^11] 表示状态2014年上海邀请赛一模一样的题,只是15变50 , 当时竟然不知道怎么做。。。。。真是傻逼了!#include <iostream>#include <cstdio>#include <queue>#include <cstdlib>#include <vector>using namespace std;const int INF = 1e9;const int maxn = 1<<11;const int ID = 20;const int dr[4] = {0 , 0 , 1 , -1};const int dl[4] = {1 , -1 , 0 , 0};int gate[ID][ID][ID][ID] , vis[ID][ID][maxn];int N , M , P , K , S;vector<int> key[ID][ID];struct point{ int x , y , sta; point(int a = 0 , int b = 0 , int c = 0){ x = a , y = b , sta = c; }};void initial(){ for(int i = 0; i < ID; i++) for(int j = 0; j < ID; j++){ key[i][j].clear(); for(int k = 0; k < maxn; k++) vis[i][j][k] = INF; for(int n = 0; n < ID; n++) for(int m = 0; m < ID; m++){ gate[i][j][n][m] = -1; } }}void readcase(){ cin >> K; int x1 , y1 , x2 , y2 , g; while(K--){ cin >> x1 >> y1 >> x2 >> y2 >> g; gate[x1][y1][x2][y2] = g; gate[x2][y2][x1][y1] = g; } cin >> S; while(S--){ cin >> x1 >> y1 >> g; key[x1][y1].push_back(g); }}void computing(){ queue<point> q; q.push(point(1 , 1 , 0)); vis[1][1][0] = 0; while(!q.empty()){ point f = q.front(); q.pop(); for(int k = 0; k < 4; k++){ int r = f.x+dr[k] , c = f.y+dl[k] , sta = f.sta , g = gate[f.x][f.y][r][c]; if(r >= 1 && r <= N && c >= 1 && c <= M && g != 0 && (g < 0 || (sta&(1<<(g-1))) > 0)){ for(int i = 0; i < key[r][c].size(); i++){ sta = sta|(1<<(key[r][c][i]-1)); } if(vis[r][c][sta] == INF){ vis[r][c][sta] = vis[f.x][f.y][f.sta]+1; q.push(point(r , c , sta)); } } } } for(int i = 0; i < maxn; i++){ if(vis[N][M][i] != INF){ cout <<vis[N][M][i] << endl; return; } } cout << -1 << endl;}int main(){ //cout << INF << ' ' << maxn << endl; while(cin >> N >> M >> P){ initial(); readcase(); computing(); } return 0;}
0 0
- hdu 4845 拯救大兵瑞恩(bfs)
- HDU 4845 拯救大兵瑞恩 基本状态压缩bfs
- HDU 4845 拯救大兵瑞恩(BFS+状态压缩)
- HDU 5094 Maze & HDU 4845 拯救大兵瑞恩 (BFS + 状压)
- 拯救大兵瑞恩
- 【HDU4845】拯救大兵瑞恩(BFS+状态压缩)
- 算法:拯救大兵瑞恩(BFS+状态压缩)
- [CTSC99]拯救大兵瑞恩
- 【CTSC1999】【拯救大兵瑞恩】
- 【搜索+状态压缩】拯救大兵瑞恩
- 软件项目管理与《拯救大兵瑞恩》
- 【CTSC1999】拯救大兵瑞恩(孤岛营救问题)
- codevs 1911孤岛营救问题/2219拯救大兵瑞恩
- 拯救大兵Touchpad
- [CTSC1999]营救大兵瑞恩
- 《拯救大兵雷恩》是一种什么电影?
- 拯救“大兵”酒吧--空间加香
- 拯救大兵雷诺(递归+回溯)
- UVa 11732 strcmp() Anyone?
- 7/16
- 2.1AutoCAD数据库概述
- android之单元测试
- 几种布局方式
- hdu 4845 拯救大兵瑞恩(bfs)
- 开源夏令营的环境数据采集系统
- 如何编写linux下nand flash驱动(集合贴)
- 关于SIGPIPE信号
- Nginx 作为Http代理服务器配置
- 字符串 上
- linux常用命令
- Win7下VS2008破解方法
- golang Package