题解 | #扫雷#
扫雷
https://www.nowcoder.com/practice/d5f277427d9a4cd3ae60ea6c276dddfd
#include <stdio.h>
//在VS上编译出简单扫雷之后 在牛客上的初次尝试 所以思路是按照我第一次的思路走 所以会略显呆板 见谅。
//可谓 同样的效果 千种的代码 学海无涯 仍需不断的学习
int main()
{
int a,b;
scanf("%d %d",&a,&b);
//雷 数组声明
char mine[a+2][b+2];
//初始化 雷数组 比输入的雷矩阵大一圈 方便使用 九宫格循环遍历 统计雷数
for (int i = 0 ; i < a+2 ; i++)
{
for (int j = 0; j < b+2 ; j++)
{
mine[i][j] = '0';
}
}
//扫雷 数组声明
char show[a+2][b+2];
//遍历输入字符 下标从 1 到 a+1
for (int i = 1 ; i < a+1 ; i++)
{
for (int j = 1 ; j < b+1 ; j++)
{
//scanf这里一定要注意" %c" ,没有空格这里就会出错 虽然有了getchar() 还是得加上空格
scanf(" %c",&mine[i][j]);
}
//吸收回车'\n' 也可用 while(getchar() != '\n');
getchar();
}
//循环遍历 雷矩阵
for (int i = 1 ; i < a+1 ; i++)
{
for (int j = 1 ; j < b+1 ; j++)
{
//如果此位置是不是雷
if(mine[i][j] != '*')
{
//计数变量 用作记录雷的数量 用于表达在 扫雷数组里
int count = 0;
//九宫格循环遍历 统计雷数
for(int m = -1 ; m < 2 ; m++)
{
for(int n = -1 ; n < 2 ; n++)
{
//判断 如果是雷 则count++
if (mine[i+m][j+n] == '*')
{
count++;
}
}
}
//将数字count加上'0'后变为字符 'count' ,因为 '0'的ASCII码值为 48(是多少都一样) 主要是'0'后面字符都是连续的'48+1'即为'1'
show[i][j] = count + '0';
}
//否则 如果此位置是雷 仍输出'*'
else
show[i][j] = '*';
}
}
//循环遍历打印 show扫雷数组
for (int i = 1 ; i < a+1 ; i++)
{
for (int j = 1 ; j < b+1 ; j++)
{
printf("%c",show[i][j]);
}
//每打印一行 记得换行
printf("\n");
}
return 0;
}
安克创新 Anker公司福利 695人发布