洛谷P2670 扫雷游戏 关于区域搜索标记的坐标增量法
最简单的思路就是扫描一边所有节点,对每个非地雷节点,去检查一下他八个方向的元素是否有‘*’,有的话就加一
但是逐个写出有点麻烦,我们不妨定义两个增量数组来存储每一次的相对位移,对每次检查只需要遍历这个数组即可
如下
#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> #include<math.h> int n, m; bool Check(int a, int b)//越界检查 { if (a >= 0 && b >= 0 && a < n && b < m) return true; else return false; } int main() { int A[8] = {-1,1,0,0,-1,-1,1,1};//行增量 int B[8] = {0,0,-1,1,-1,1,-1,1};//列增量,行列增量是一一对应的 char S[101][101]; scanf("%d %d", &n, &m); for (int i = 0; i < n; i++) scanf("%s", S[i]); for(int i=0;i<n;i++) for (int j = 0; j < m; j++) { if (S[i][j] != '*') { S[i][j] = 0; for (int k = 0; k < 8; k++) { if(Check(i + A[k], j + B[k])) if (S[i + A[k]][j + B[k]] == '*') S[i][j]++; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (S[i][j] == '*') printf("*"); else printf("%d", S[i][j]); } printf("\n"); } return 0; }