P2670 [NOIP2015 普及组] 扫雷游戏

1.题目介绍

[NOIP2015 普及组] 扫雷游戏

题目背景

NOIP2015 普及组 T2

题目描述

扫雷游戏是一款十分经典的单机小游戏。在 nm 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出 nm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式

第一行是用一个空格隔开的两个整数 nm,分别表示雷区的行数和列数。

接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符 * 表示相应格子是地雷格,字符 ? 表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式

输出文件包含 n 行,每行 m 个字符,描述整个雷区。用 * 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

样例 #1

样例输入 #1

3 3
*??
???
?*?

样例输出 #1

*10
221
1*1

样例 #2

样例输入 #2

2 3
?*?
*??

样例输出 #2

2*1
*21

提示

对于 100%的数据,1n100,1m100

2.题解

2.1 模拟

思路

1.这里我们首先是会用两个数组dx,dy;这样后面方便表示周围的8个数,另外注意一般题设均是行(竖)-> 列(横),为了方便对应x,y;我们修改了坐标系如下

2.边界问题:访问周围的8个数,很有可能导致数组越界,有两种处理方式,一种是进行越界判断,一种是加入一层虚拟边界,下述程序用的是第二种

代码

#include<bits/stdc++.h>
using namespace std;
const int dx[] = {1,1,1,0,0,-1,-1,-1};
const int dy[] = {-1,0,1,-1,1,-1,0,1};
const int maxn = 105;
char g[maxn][maxn];
int main(){
	int n , m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> g[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			//这里使用了一些偷懒的技巧,没有加上一圈“虚拟边框”,但不影响判断 
			//这里的数组g[maxn][maxn] 自动初始化为 '\0',而我们一个是这里g[i][j]均是从索引1开始,所以相当于自动加了一层虚拟边界
			// 后续直接通过判断四周八个点是否为'*' 即可,边界'\0'不会有任何影响 
			if(g[i][j] != '*'){
				int cnt = 0;
				for(int m = 0; m < 8; m++){
					if(g[i+dx[m]][j+dy[m]] == '*') cnt++; 
				}
				cout << cnt;	
			}
			else cout << '*';
		}
		cout << endl;
	}
}
posted @   DawnTraveler  阅读(452)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示