描述
扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。
输入
第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出
n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
样例输入
3 3 *?? ??? ?*?
样例输出
*10 221 1*1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n, m; // 定义两个整数变量n和m,用于存储输入的行数和列数
scanf("%d%d", &n, &m); // 从标准输入读取n和m的值
int sum = 0; // 定义一个整数变量sum,用于存储每个星号周围星号的数量
char a[n][m]; // 定义一个二维字符数组a,用于存储输入的矩阵
for (int i = 0; i < n; i++) { // 遍历矩阵的每一行
scanf("%s", a[i]); // 从标准输入读取一行字符串,并将其存储在数组a中
}
for (int i = 0; i < n; i++) { // 遍历矩阵的每一行
for (int j = 0; j < m; j++) { // 遍历矩阵的每一列
if (a[i][j] == '*') { // 如果当前位置是星号
printf("%c", a[i][j]); // 输出星号
} else { // 如果当前位置不是星号
if (i - 1 >= 0 && j + 1 < m) { // 判断当前位置的右上方是否有星号
if (a[i - 1][j + 1] == '*') { // 如果右上方有星号
sum++; // sum加1
}
}
if (j + 1 < m) { // 判断当前位置的右方是否有星号
if (a[i][j + 1] == '*') { // 如果右方有星号
sum++; // sum加1
}
}
if (i - 1 >= 0) { // 判断当前位置的下方是否有星号
if (a[i - 1][j] == '*') { // 如果下方有星号
sum++; // sum加1
}
}
if (i + 1 < n && j - 1 >= 0) { // 判断当前位置的左上方是否有星号
if (a[i + 1][j - 1] == '*') { // 如果左上方有星号
sum++; // sum加1
}
}
if (i + 1 < n) { // 判断当前位置的下方是否有星号
if (a[i + 1][j] == '*') { // 如果下方有星号
sum++; // sum加1
}
}
if (j - 1 >= 0) { // 判断当前位置的左方是否有星号
if (a[i][j - 1] == '*') { // 如果左方有星号
sum++; // sum加1
}
}
if (i - 1 >= 0 && j - 1 >= 0) { // 判断当前位置的左下方是否有星号
if (a[i - 1][j - 1] == '*') { // 如果左下方有星号
sum++; // sum加1
}
}
if (i + 1 < n && j + 1 < m) { // 判断当前位置的右下方是否有星号
if (a[i + 1][j + 1] == '*') { // 如果右下方有星号
sum++; // sum加1
}
}
printf("%d", sum); // 输出当前位置周围星号的数量
}
sum = 0; // 重置sum的值
}
printf("\n"); // 输出换行符
}
return 0; // 返回0表示程序正常结束
}
#include<bits/stdc++.h>
using namespace std;
char a[105][105];//定义字符二维数组
int xx[10]={0,-1,1,0,0,-1,1,-1,1};//定义行号方向数组
int yy[10]={0,0,0,-1,1,-1,-1,1,1};//定义列号方向数组
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];//输入字符数组
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='*')//如果该位置是*号,直接打印
cout<<"*";
else//如果是非地雷格
{
int sum=0;//定义计数器为0
for(int k=1;k<=8;k++)//遍历方向数组下标
{
int x=i+xx[k];//行号更新
int y=j+yy[k];//列号更新
if(x>=1&&x<=n&&y>=1&&y<=m)//如果没有越界的话
{
if(a[x][y]=='*')//如果该位置是地雷
sum++;//计数器增加
}
}
cout<<sum;//打印地雷数
}
}
cout<<endl;//换行
}
return 0;
}