迷宫bfs转弯

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/79950511
链接:https://www.nowcoder.com/acm/contest/96/G
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走,
'P'代表人物位置,'K'代表钥匙,'E'代表出口。人物一个,钥匙有多个,
('K'的数量<=50)),出口一个,每个位置可以向(上,下,左,右)四个
方向走一格,花费一个单位时间,现在你需要花费最少的时间拿到钥匙
然后从迷宫的出口出去(若没有钥匙,则不能进入迷宫出口所在的格子)。

输入描述:

第一行一个整数T(T <= 50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表地图的行和列
接下来n行,每行一个长度为m的字符串,组成一个图。

输出描述:

如果可以出去,输出所花费的最少时间。
如果不能出去,输出一行"No solution"。


这道题是典型的bfs转弯问题,出口和钥匙的位置是任意的,所以每个点要标记上两种状态
即 拿过钥匙时走过 和没拿钥匙时走过  
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 505;

struct node{
	int x;
	int y;
	int step;
	int getKey;  // 1表示拿到钥匙  0表示没有钥匙 
//	node(int x,int y,int step,int getKey)
//	{
//		this->x = x;
//		this->y = y;
//		this->step = step;
//		this->getKey = getKey;
//	}
};
int t, n, m;
int pX, pY, eX, eY;
char mp[maxn][maxn];
int visit[maxn][maxn][2];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int bfs()
{
	queue<node> q;
	node fir, tmp;
	fir.x = pX;
	fir.y = pY;
	fir.step = 0;
	fir.getKey = 0;
	q.push(fir);
	while(!q.empty())
	{
		tmp = q.front();
		q.pop();
		if(tmp.x == eX && tmp.y == eY) return tmp.step;
		
		for(int i = 0;i < 4;i ++)
		{
			fir = tmp;
			fir.x += dir[i][0];
			fir.y += dir[i][1];
			fir.step ++;
			if(fir.x >= 1 && fir.y >= 1 && fir.x <= n && fir.y <= m && mp[fir.x][fir.y] != '#')
			{
				if(mp[fir.x][fir.y] == 'E' && fir.getKey == 0) continue;
				if(mp[fir.x][fir.y] == 'K') fir.getKey = 1;
				if(!visit[fir.x][fir.y][fir.getKey])
				{
					q.push(fir);
					visit[fir.x][fir.y][fir.getKey] = 1;
				}
			}
		}
	}
	return -1;
}

int main()
{    
	cin >> t;
	while(t --)
	{
		memset(visit,0,sizeof(visit));
		cin >> n >> m;
		for(int i = 1;i <= n;i ++)
		{
			for(int j = 1;j <= m;j ++)
			{
				cin >> mp[i][j];
				if(mp[i][j] == 'P')
				{
					pX = i;
					pY = j;
				}
				if(mp[i][j] == 'E')
				{
					eX = i;
					eY = j;
				}
			}
		}
		
		int res = bfs();
		if(res != -1)
		cout << res << endl;
		else
		cout << "No solution" << endl;
		
	}
	return 0; 
}


阅读更多

没有更多推荐了,返回首页