【BFS】 扫雷 北京信息科技大学校赛F

链接:https://www.nowcoder.com/acm/contest/118/F

来源:牛客网

 

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。当某个位置为数字的时,代表它周围的八连通区域中有对应数量的雷。   kirai获取了简化版扫雷(没有标记雷的小旗)的后台数据(后台数据包括所有数字和雷的位置),转换为一个n*m(1≤n, m≤500)的矩阵并对格子类型做了如下标记: 雷被标记为'*';点开的空白区域标记为'0'; 未点开的空白区域标记为'.'; 数字1~8代表周围有多少雷; kirai非常笨,他希望你帮他完成这样的任务: 给定k(1≤k≤min(可扫位置数, 10))个位置坐标和扫雷游戏的后台数据,输出点开指定位置序列后游戏的结果,初始时游戏中没有点开任何位置。注:数据保证扫雷过程中不会重复点击已扫位置。

输入描述:

输入样例有多组,全部是正整数。首先输入样例组数T(T≤10)。接下来输入T组数,每组数据第一行包括四个正整数n,m,k(1≤n, m≤500, 1≤k≤min(可扫位置数, 10))分别表示地图的行、列数和即将点开的位置数。紧接着是一个n*m的矩阵,代表扫雷的后台数据,。矩阵后是k个整数对xi,yi(1≤i≤k, 1≤xi≤n, 1≤yi≤m),表示依次点开的位置。

输出描述:

如果某一步踩到雷,输出"Game over in step x"(不包括引号",表示第x步踩中雷);未踩到雷则根据扫雷的游戏规则更新,并输出最后一步结束后显示给kirai的矩阵。

 

 

扫描二维码关注公众号,回复: 777955 查看本文章

 

示例1

 

 

 

输入

 

1

5 5 3

2*11*

*2111

22...

*1...

11...

1 1

3 3

1 2

 

 

 

输出

 

Game over in step 3

 

 

 

说明

 

2....

.....

.....

.....

.....

2....

.2111

.2000

.1000

.1000

Game over in step 3


#include <bits/stdc++.h>

using namespace std;
const int MAXN = 510;
char ch1[MAXN][MAXN], ch2[MAXN][MAXN];
int a[MAXN], b[MAXN], book[MAXN][MAXN];
int main()
{
	int T;
	cin >> T;
	while ( T-- )
	{
		int n, m, k;
		memset ( book, 0, sizeof ( book ) );
		cin >> n >> m >> k;
		for ( int i = 1; i <= n; i++ )
			for ( int j = 1; j <= m; j++ )
			{
				cin >> ch1[i][j];
				ch2[i][j] = '.';
			}

		for ( int i = 1; i <= k; i++ )
			cin >> a[i] >> b[i];
		bool flag = 0;
		for ( int i = 1; i <= k; i++ )
		{
			if ( ch1[a[i]][b[i]] == '*' )
			{
				printf ( "Game over in step %d\n", i );
				flag = 1;
				break;
			}
			else if ( ch1[a[i]][b[i]] >= '1' && ch1[a[i]][b[i]] <= '8' )
				ch2[a[i]][b[i]] = ch1[a[i]][b[i]];
			else if ( ch1[a[i]][b[i]] == '.' )  //BFS
			{
				int dir[8][2] = {{0, 1}, {0, -1}, {1, 0}, { -1, 0}, { -1, -1}, { -1, 1}, {1, -1}, {1, 1}};
				//8向 需要标记是否访问 因会发生重复访问
				queue<pair<int, int> > q;
				q.push ( make_pair ( a[i], b[i] ) );
				book[a[i]][b[i]] = 1;  //访问过
				while ( !q.empty() )
				{
					pair<int, int>p = q.front();
					q.pop();
					int x = p.first;
					int y = p.second;
					ch1[x][y] = '0';
					ch2[x][y] = '0';
					for ( int d = 0; d < 8; d++ )
					{
						int tx = x + dir[d][0];
						int ty = y + dir[d][1];
						if ( tx < 1 || tx > n || ty < 1 || ty > m || book[tx][ty] )
							continue;
						if ( ch1[tx][ty] == '.' )  //且未访问
						{
							book[tx][ty] = 1;
							q.push ( make_pair ( tx, ty ) );
						}
						else if ( ch1[tx][ty] >= '1' && ch1[tx][ty] <= '8' )
							ch2[tx][ty] = ch1[tx][ty];
					}
				}
			}
		}
		if ( !flag )
		{
			for ( int i = 1; i <= n; i++ )
			{
				for ( int j = 1; j <= m; j++ )
					cout << ch2[i][j];
				cout << endl;
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ummmmm/article/details/80211011