扫雷
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
char a[105][105];
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<<a[i][j];
continue;
}
int sum=0;
sum+=(a[i-1][j-1]=='*');
sum+=(a[i-1][j]=='*');
sum+=(a[i-1][j+1]=='*');
sum+=(a[i+1][j-1]=='*');
sum+=(a[i+1][j]=='*');
sum+=(a[i+1][j+1]=='*');
sum+=(a[i][j+1]=='*');
sum+=(a[i][j-1]=='*');
cout<<sum;
}
cout<<endl;
}
return 0;
}
for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if (a[i][j] == '*') { cout << a[i][j]; continue; } int sum = 0; sum += (a[i - 1][j - 1] == '*'); sum += (a[i - 1][j] == '*'); sum += (a[i - 1][j + 1] == '*'); sum += (a[i + 1][j - 1] == '*'); sum += (a[i + 1][j] == '*'); sum += (a[i + 1][j + 1] == '*'); sum += (a[i][j + 1] == '*'); sum += (a[i][j - 1] == '*'); cout << sum; } cout << endl; }
- 又是一组嵌套的
for
循环,用于遍历整个二维字符数组a
,外层循环按行遍历(从第 1 行到第n
行),内层循环按列遍历(从第 1 列到第m
列)。 - 在循环体内部,首先有一个
if
判断语句:if (a[i][j] == '*'):判断当前位置(i行j列)的字符是否为*,如果是*,则直接通过cout << a[i][j];输出该字符,然后使用continue语句跳过本次内层循环后面的代码,进入下一次内层循环(也就是直接处理下一个位置的字符)。 - 如果当前位置字符不是
*
,则执行以下操作:int sum = 0;:定义一个整型变量sum,用于统计当前位置周围(上下左右以及斜对角方向)字符为*的个数。接下来的一系列语句:sum += (a[i - 1][j - 1] == '*');等:通过条件判断语句(a[某个位置] == '*')来判断当前位置周围的 8 个相邻位置(在二维数组边界范围内的有效相邻位置)的字符是否为*,如果是,则将sum的值加 1。这里巧妙地利用了 C++ 中布尔值与整型的转换关系,当条件判断为true(即字符是*)时,相当于将 1 加到sum上,判断为false(字符不是*)时,相当于加 0。最后通过cout << sum;输出统计得到的当前位置周围*字符的个数。