逃离迷宫 bfs

原创 2018年04月15日 16:46:47
链接:https://www.nowcoder.com/acm/contest/96/G
来源:牛客网
题目描述


给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走, 'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个, ('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个 方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙 然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。
输入描述:
第一行一个整数T(T <= 50),代表数据的组数接下来一行n,m(n<=500,m<=500),代表地图的行和列接下来n行,每行一个长度为m的字符串,组成一个图。
输出描述:
如果可以出去,输出所花费的最少时间。如果不能出去,输出一行"No solution"。

示例1

输入
3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K



输出
No solution
12
No solution
思路:vis数组三维,除了要保存是否访问,第三维额外保存当前有无钥匙的状态。
Code:
/*#include <bits/stdc++.h>
using namespace std;
const int AX = 5e2+66;
struct Node{
	int x,y,k;
};
int dir[4][2] = {
	{1,0},
	{0,1},
	{-1,0},
	{0,-1}
};
char G[AX][AX];
int n , m ;
int vis[AX][AX][2];

int bfs( int x, int y ){
	memset( vis , -1 , sizeof(vis) );
	queue<Node>que;
	Node tmp ;
	tmp.x = x ;
	tmp.y = y ;
	tmp.k = 0;
	vis[x][y][tmp.k] = 0;
	que.push(tmp);
	while( !que.empty() ){
		Node q = que.front();
		que.pop();
		if( G[q.x][q.y] == 'E' && q.k ) return vis[q.x][q.y][1];
		for( int i = 0 ; i < 4 ; i++ ){
			int xx = q.x + dir[i][0];
			int yy = q.y + dir[i][1];
			if( xx >= 0 && xx < n && yy >= 0 && yy < m && G[xx][yy] != '#' ){
				Node tp ;
				if( G[xx][yy] == 'K' ) tp.k = 1;
				else tp.k = q.k;
				if( vis[xx][yy][tp.k] != -1 ) continue;
				if( G[xx][yy] == 'E' && !tp.k ) continue;
				tp.x = xx;
				tp.y = yy;
				vis[tp.x][tp.y][tp.k] = vis[q.x][q.y][q.k] + 1;
				que.push(tp);
			}
		}

	}
	return -1;
}

int main(){
	int T;
	scanf("%d",&T);
	while( T-- ){
		int sx,sy;
		scanf("%d%d",&n,&m);
		for( int i = 0 ; i < n ; i++ ){
			scanf("%s",G[i]);
		}
		for( int i = 0 ; i < n ; i ++ ){
			for( int j = 0 ; j < m ; j++ ){
				if( G[i][j] == 'P' ){
					sx = i;
					sy = j;
					break;
				}
			}
		}
		int res = bfs(sx,sy);
		if( res != -1 ){
			cout << res << endl;
		}else{
			cout << "No solution" << endl;
		}
	}
	return 0 ;
}*/

#include <bits/stdc++.h>
using namespace std;
const int AX = 5e2+66;
struct Node{
	int x,y,step,k;
};
int dir[4][2] = {
	{1,0},
	{0,1},
	{-1,0},
	{0,-1}
};
char G[AX][AX];
int n , m ;
int vis[AX][AX][2];

int bfs( int x, int y ){
	memset( vis , 0 , sizeof(vis) );
	queue<Node>que;
	Node tmp ;
	tmp.x = x ;
	tmp.y = y ;
	tmp.k = 0;
	tmp.step = 0;
	vis[x][y][tmp.k] = 1;
	que.push(tmp);
	while( !que.empty() ){
		Node q = que.front();
		que.pop();
		if( G[q.x][q.y] == 'E') return q.step;
		for( int i = 0 ; i < 4 ; i++ ){
			int xx = q.x + dir[i][0];
			int yy = q.y + dir[i][1];
			if( xx >= 0 && xx < n && yy >= 0 && yy < m && G[xx][yy] != '#' ){
				Node tp;
				if( G[xx][yy] == 'K' ){
					tp.k = 1;
				}else tp.k = q.k;
				if( vis[xx][yy][tp.k] ) continue;
				vis[xx][yy][tp.k] = 1;
				if( G[xx][yy] == 'E' && !vis[xx][yy][1] ) continue;
				tp.x = xx;
				tp.y = yy;
				tp.step = q.step + 1 ;
				que.push(tp);
			}
		}
	}
	return -1;
}

int main(){
	int T;
	scanf("%d",&T);
	while( T-- ){
		int sx,sy;
		scanf("%d%d",&n,&m);
		for( int i = 0 ; i < n ; i++ ){
			scanf("%s",G[i]);
		}
		for( int i = 0 ; i < n ; i ++ ){
			for( int j = 0 ; j < m ; j++ ){
				if( G[i][j] == 'P' ){
					sx = i;
					sy = j;
					break;
				}
			}
		}
		int res = bfs(sx,sy);
		if( res != -1 ){
			cout << res << endl;
		}else{
			cout << "No solution" << endl;
		}
	}
	return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许也可以转载。 https://blog.csdn.net/FrankAx/article/details/79950634

hdu1728逃离迷宫(BFS)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:balabala一大堆,就是说在限制条件内走到终点就算yes; 心得:坑爹啊,今天写了两道bf...
  • qq_29980371
  • qq_29980371
  • 2017-04-24 18:48:34
  • 175

逃离迷宫(bfs)

题意:给出一个图和两个点的坐标,以及一个整数k,求从一个点是否能在k次拐弯内到达另一个点链接: http://acm.hdu.edu.cn/webcontest/contest_showproble...
  • qq_35399846
  • qq_35399846
  • 2016-07-28 09:50:30
  • 182

HDU 1728逃离迷宫(DFS或者BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • opm777
  • opm777
  • 2014-01-11 15:55:49
  • 1459

hdoj 1728 逃离迷宫 【BFS 记录转弯次数】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-05 20:15:58
  • 739

HDU1728 逃离迷宫【BFS】

题目大意: 有一个M*N的矩阵迷宫。其中,字符'.'表示此处为空地,字符'*'表示此处为障碍。在迷宫中,只能向 相邻的上、下、左、右方向走。而且在走的时候,转弯最多不能超过k次。给你初始位置(x1,y...
  • u011676797
  • u011676797
  • 2015-04-05 23:22:28
  • 665

Hdoj 1728 逃离迷宫 【BFS】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • shengweisong
  • shengweisong
  • 2015-05-31 18:13:13
  • 871

hdu 1728 逃离迷宫 (BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。注意不要把行列搞...
  • Zhuhuangjian
  • Zhuhuangjian
  • 2012-12-05 21:35:49
  • 2943

经典迷宫问题 BFS 广度优先

给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可...
  • qq_26891045
  • qq_26891045
  • 2016-03-12 11:17:37
  • 1583

hdu1728 逃离迷宫(bfs限制拐弯次数)

http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给你一张图,*代表墙,.代表路,给你起点终点坐标和限制的拐弯次数,求起点是否可以在拐弯次数内到达终...
  • Flynn_curry
  • Flynn_curry
  • 2016-10-23 13:13:30
  • 492

CDOJ 1088 王之迷宫 BFS

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 王被困在了一个3维的迷宫中,他...
  • code12hour
  • code12hour
  • 2015-06-21 20:06:03
  • 644
收藏助手
不良信息举报
您举报文章:逃离迷宫 bfs
举报原因:
原因补充:

(最多只允许输入30个字)