题解 | #扫雷#
扫雷
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; }