蓝桥杯—扫雷问题

你玩过扫雷游戏吗?这是一个可爱的小游戏,在一个特定的操作系统中,我们不能真正记住它的名字。嗯,游戏的目标是找出M×N场中所有的地雷在哪里。为了帮助你,游戏显示了一个正方形中的一个数字,它告诉你在那个方块附近有多少个地雷。例如,将以下4×4字段设为2枚地雷(以“*”字表示,“.”为安全区)

在这里插入图片描述

如果我们表示相同的字段,放置上面描述的提示号,那么我们将得到以下结果:

在这里插入图片描述

输入格式

输入将由任意数目的字段组成。每个字段的第一行包含两个整数n和m(0<n,m≤100),分别代表字段的行数和列数。下面的n行正好包含m个字符,并表示字段。每个安全广区都用“.”表示。字符(没有引号)和每个矿方格由一个‘*’字符表示(也没有引号)。第一个字段行,其中n=m=0表示输入的结尾,不应该进行处理。

输出格式

对于每个字段,必须单独在一行中打印以下消息:Field #x:其中x代表字段的数目(从1开始)。下一个n行应该包含“.”字段。将字符替换为与该方格相邻的地雷的数目。字段输出之间必须有空行。

输入样式

在这里插入图片描述
输出样式

在这里插入图片描述
扫雷的主要问题就是判断周围雷的个数
ch[i][j]表示雷区中的一个位置,那么就判断周围雷的个数
ch[i-1][j-1],ch[i-1][j],ch[i-1][j+1],ch[i][j-1],ch[i][j+1],ch[i+1][j-1],ch[i+1][j],ch[i+1][j+1];
即左上,上,右上,左,右,左下,右下。八个方位的位置。
接下来,判断该位置周围是否越界。
即:0<= i <n, 0<= j <m;

循环判断周围代码实现如下:

int count1 = 0;   // 统计该位置周围雷的个数
for(int k = i-1; k <= i+1; k++){
   for(int l = j-1; l <= j+1; l++)
	  if(ch[k][l] == '*'&& k>=0 && k<n && l>=0 && l<m)
				count1++;
}	 

全部代码实现如下:

#include<bits/stdc++.h>
using namespace std;
char ch[105][105];  //矩阵 
int main() {
	int n, m;  // n-行, m-列 
	int s = 1; // s-打印次数 
	cin >> n >> m;
	memset(ch, '0',sizeof(ch));  //数组初始化为'0' 
	while(n!=0 && m!=0) {        // n=m=0,退出打印 
		for(int i = 0; i < n; i++ )  // 布置雷区
			for(int j = 0; j < m; j++) {
				cin >> ch[i][j];
			}
		cout << "Field #" << s << ":" << endl;  //打印次数标题 
		for(int i = 0; i < n; i++ ) {
			for(int j = 0; j < m; j++) {
			    int count1 = 0;  //统计该位置周围雷的个数 
				if(ch[i][j] == '*') {     //该位置是雷,直接打印 
				    printf("%c", ch[i][j]);
					continue;
				} else {
					
					for(int k = i-1; k <= i+1; k++)     //循环判断左右上下是否为雷 
						for(int l = j-1; l <= j+1; l++)
							if(ch[k][l] == '*'&& k>=0 && k<n && l>=0 && l<m)
								count1++;
				}
				cout << count1;  
			}
			cout << endl; // 打印一行,换行 
		}
		cin >> n >> m;  // 下一次布局的大小 
		s++;
	}
	cout << 0 << " " << 0 << endl;
	return 0;
}

以上是个人理解!!!

发布了4 篇原创文章 · 获赞 0 · 访问量 155

猜你喜欢

转载自blog.csdn.net/weixin_44722531/article/details/104649919
今日推荐