前言
今天咱们一起学习一下怎么扫雷。
一、扫雷
题目来源:
描述
小sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵,他希望你帮他生成一个扫雷矩阵。
扫雷矩阵的每一行每一列都是一个数字,每个数字的含义是与当前位置相邻的8个方向中,有多少个雷(在下图中,雷用*表示);如果当前位置就是雷的话,仍输出一个*。
比如初始的雷矩阵如下:
....
..**
*.*.
.*.*
对应的数字矩阵为:
0122
13**
*4*4
2*3*
输入描述:
第一行两个整数n,m,代表矩阵有n行m列
接下来共n行,每行m个字符
输出描述:
输出共n行m列,为扫雷矩阵。
二、分析问题
规则:一定要明白扫雷的规则,就是一个数字表示它自身周围的八个格子有它数字相应数量的雷
那么我们要按题目完成任务就要使用防御编程,发现一个*(雷),整圈+1。
但是我们也要注意,因为*周边一圈里可能也有*,所以它是不能够加一的,要解决这个就要用到换元的思想了,把*=1。
三、解决问题
代码如下:
#include<stdio.h> int main() { int arr[1000][1000] = {0}, n, m; char input; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { getchar(); for (int j = 1; j <= m; j++) { scanf("%c", &input); if (input == '*') arr[i][j] = 1; //把*=1 else arr[i][j] = 0; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (arr[i][j] == 1) printf("*"); //数组==1的时候可以知道那里是* else printf("%d", arr[i - 1][j - 1] + //如果那个点不是雷,把周边的数字都加起来,如果周围有雷点,+1了,没有雷本来也是0,没有影响 arr[i - 1][j] + arr[i - 1][j + 1] + arr[i][j - 1] + arr[i][j + 1] + arr[i + 1][j - 1] + arr[i + 1][j] + arr[i + 1][j + 1]); } printf("\n"); } return 0; }
这道题最主要是了解,怎么判断周围是否加一。
总结
本篇内容只是和大家简单学习了一下怎么扫雷,希望对大家有帮助。