百练 / 2018大数据研究中心夏令营上机考试 C:逃离迷宫

题目来源:http://bailian.openjudge.cn/dsj2018xly/C

C:逃离迷宫

总时间限制1000ms    内存限制65536kB

描述

你在一个地下迷宫中找到了宝藏,但是也触发了迷宫机关,导致迷宫将在T分钟后坍塌,为此你需要在T分钟内逃离迷宫,你想知道你能不能逃离迷宫。迷宫是一个边长为m的正方形,其中"S"表示你所在的位置,"E"表示迷宫出口,"."是可以随意走动的区域,"#"是不可穿行的墙壁,每次你可以耗费1分钟在区域间移动(上下左右四个方向)。

输入

输入包含多组数组,第一行是一个整数K1 <= K <= 10),表示有K组数据。接下来每组数组包含整数m(2<=m<=10)和整数Tm表示正方形迷宫的边长,T表示坍塌时间。其后是一个m*m的字符矩阵,包含字符"S", "E", ".""#"

输出

每组数据输出一行,输出“YES"或者"NO",表示是否可以在坍塌之前逃离(也就是说移动次数是否可以不超过T)。

样例输入

2
4 7 
S...
###.
.#E.
..#.     
3 4
S..
..#
.#E

样例输出

YES
NO

--------------------------------------------------------------

思路

广搜求不带权最短路

-----------------------------------------------------

代码 

#include
#include
#include
using namespace std;

struct node {
	int x,y;
	int tcnt;

	node(void) {}
	node(int xx, int yy, int tt): x(xx), y(yy), tcnt(tt){}
};

int m,t;
char mat[12][12] = {};

int bfs(int x0, int y0, int x1, int y1)
{
	if (x0==x1 && y0==y1)
	{
		return 0;
	}
	node nd(x0, y0, 0);
	int x,y;
	queue q;
	q.push(nd);
	while (!q.empty())
	{
		nd = q.front();
		q.pop();
		x = nd.x;
		y = nd.y;
		if (x0)
		{
			if (mat[x-1][y]=='E')
			{
				return nd.tcnt+1;
			}
			else if (mat[x-1][y]=='.')
			{
				q.push(node(x-1,y,nd.tcnt+1));
				mat[x-1][y] = '*';
			}
		}
		if (y0)
		{
			if (mat[x][y-1]=='E')
			{
				return nd.tcnt+1;
			}
			else if (mat[x][y-1]=='.')
			{
				q.push(node(x,y-1,nd.tcnt+1));
				mat[x][y-1] = '*';
			}
		}
	}
	return -1;
}


int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin ("C.txt");
	int k,i,j,x0,y0,x1,y1,ans;
	fin >> k;
	while (k--)
	{
		fin >> m >> t;
		for (i=0; i> mat[i][j];
				if (mat[i][j]=='S')
				{
					x0 = i;
					y0 = j;
				}
				else if (mat[i][j]=='E')
				{
					x1 = i;
					y1 = j;
				}
			}
		}
		ans = bfs(x0,y0,x1,y1);
		if (ans <= t && ans >= 0)
		{
			cout << "YES" << endl;
		}
		else
		{
			cout << "NO" << endl;
		}
	}
	fin.close();
#endif
#ifdef ONLINE_JUDGE
	int k,i,j,x0,y0,x1,y1,ans;
	cin >> k;
	while (k--)
	{
		cin >> m >> t;
		for (i=0; i> mat[i][j];
				if (mat[i][j]=='S')
				{
					x0 = i;
					y0 = j;
				}
				else if (mat[i][j]=='E')
				{
					x1 = i;
					y1 = j;
				}
			}
		}
		ans = bfs(x0,y0,x1,y1);
		if (ans <= t && ans >= 0)
		{
			cout << "YES" << endl;
		}
		else
		{
			cout << "NO" << endl;
		}
	}
#endif
}


你可能感兴趣的:(百练,Cpp,大数据中心夏令营,广搜,最短路,百练OJ/poj)