洛谷P2670 扫雷游戏 关于区域搜索标记的坐标增量法

发布时间 2023-04-12 18:29:44作者: 凪风sama

最简单的思路就是扫描一边所有节点,对每个非地雷节点,去检查一下他八个方向的元素是否有‘*’,有的话就加一

但是逐个写出有点麻烦,我们不妨定义两个增量数组来存储每一次的相对位移,对每次检查只需要遍历这个数组即可

如下

#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;
}