解题思路:使用二维数组解题 为了不判断边界,将扫雷原本最大的范围30*16扩大为32*18 将数组想象成平面上的直角坐标系 我们从(1,1)这一点开始处理我们的数据 为了简化运算少使用if语句 从(1,1)开始可以保证我们在小边界(30*16)的每一个坐标旁边的九宫格范围内都可以进行直接的加一运算 不需要考虑数组越界的问题 而第0列第0行这些无用的数据只需要靠循环变量从i=1开始 不进行输出就可以了


注意事项:最后再把雷加入到输出数组里 防止雷那一个格因为和其他雷相邻导致出现的bug

参考代码:

#include <stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
char Minesweeperin[30+2][16+2]; //windows上扫雷最大是30*16 这里给30*16都相应的扩大边长 可以不需要使用多个if来判断雷是否在边上
char Minesweeperout[30+2][16+2];//建立同样的输出数组和输入数组一一对应
int main()
{
	int n, m, i, j, a = 1;
	while (cin >> n >> m) {
		if (n == 0 && m == 0) break; //按照题目要求 为0跳出
		memset(Minesweeperout, '0', sizeof(Minesweeperout));//使用memset函数将数组全部填充为'0' 为了后面输出数组可以直接计算
		for (i = 1; i <= n; i++) {
			for (j = 1; j <= m; j++) {
				cin >> Minesweeperin[i][j];
				if (Minesweeperin[i][j] == '*') { //对于输入数组有雷的坐标 在输出数组的相同坐标的九宫格内进行运算
					Minesweeperout[i - 1][j - 1]++; 
					Minesweeperout[i - 1][j]++;
					Minesweeperout[i - 1][j + 1]++;
					Minesweeperout[i][j - 1]++;
					Minesweeperout[i][j + 1]++;
					Minesweeperout[i + 1][j - 1]++;
					Minesweeperout[i + 1][j]++;
					Minesweeperout[i + 1][j + 1]++;
				}
			}
		}
		cout << "Field" << " " << "#" << a << ":" << endl;
		a++;
		for (i = 1; i <= n; i++) { //从1开始 数组的最外面一圈是我们不需要的
			for (j = 1; j <= m; j++) {
				if (Minesweeperin[i][j] == '*'){
					Minesweeperout[i][j] = Minesweeperin[i][j];//在这里再将雷填入输出数组 防止雷所在格输出的不是雷
				}
				cout << Minesweeperout[i][j];
			}
			cout << endl;
		}
		cout << endl;//注意最后换行
	}
	return 0;
}


点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论