解题思路:

       在你输入的网格周围,在填充一圈格子,并且这一圈格子都是没有雷的。

       遍历你输入的网格:

              如果这个格子上是雷的话,遍历下一个格子。

              如果这个格子不是雷的话,将每个小格子与它周边的八个格子看作一个单元结构,遍历这个九宫格,计算雷的数量。

注意事项:

       填充完一圈格子之后,原本m*n的网格变成了(m+2)*(n+2)的网格
       注意输出格式,笔者因为输出格式的问题,被恶心了好多次呢:>

参考代码:

#include<iostream>
using namespace std;
int main()
{
	char a[52][52] = { 0 };
	int m, n, w = 1;//m n分别是输入网格的纵长和横长,w用作计数器,记录file数量
	cin >> m >> n;
	while (m != 0 && n != 0)
	{
	    //给周边一圈赋值'.'
		for (int i = 0; i < n + 2; i++)
			a[0][i] = '.';//第0行
		for (int i = 1; i < m+1; i++)
		{
			a[i][0] = '.';//给每一行的第一个格子赋值'.'
			for (int x = 1; x <= n; x++)
				cin >> a[i][x];
			a[i][n + 1] = '.';//给每一行的最后一个格子赋值'.'
		}
		for (int i = 0; i < n + 2; i++)
			a[m + 1][i] = '.';//最后一行
		
		cout << "Field #" << w << ':' << endl;//题目要求
		
		//遍历网格中你要输出的格子
		for (int i = 1; i <= m; i++)//注意:从第一行开始,不是第0行
		{
			for (int j = 1; j <= n; j++)//同上
			{
				int p = 0;//初始化雷的数量为0
				if (a[i][j] == '*')
				{
					cout << '*';
					continue;//如果该格中有雷,则不用计算它周边雷数,直接进入下一次循环
				}
				else//如果该格中没有雷,遍历以它为中心的九宫格
				{
					for (int x = i - 1; x < i + 2; x++)//自行画图理解
						for (int y = j - 1; y < j + 2; y++)
							if (a[x][y] == '*')p++;//有雷则p+1
				}
				cout << p;//输出每个格子周围的雷数
			}
			cout << endl;
		}
		cout << endl;
		w++;//输出完一组后w+1
		cin >> m >> n;//输入下一组数据
	}
	return 0;
}

第一次写题解,请多包涵

笔者才大一,写的不好别骂,标题装杯用的,所以在最后装死了

点赞(0)
 

0.0分

2 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论