题目:

小sun上课的时候非常喜欢玩扫雷。现在小sun有一个初始的雷矩阵,他希望你帮他生成一个扫雷矩阵。

扫雷矩阵的每一行一列都是一个数字, 每个数字的含义是与当前位置相邻的8个方向中,多少个雷(在下图中,用”“表示) ,如果当前位置就是雷的话,仍输出一个”“。

输入描述:

第一行两个整数n,m,代表矩阵有n行m列

接下来共n行,每行m个字符

输出描述:

输出共n行m列,为扫雷矩阵。

示例:

输入:

4 4
....

..**

*.*.

.*.*

输出:

0122
13**
*4*4
2*3*

代码实现:

题目分析及实现思想,皆在代码注释中。

1、使用动态内存,并不更改储存数据

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <malloc.h>

int main()
{
    //控制2层循环循环
    int i = 0;
    int j = 0;

    //数雷时,控制下标
    int x = 0;
    int y = 0;

    //接收行与列数据
    int n = 0;
    int m = 0;

    //雷的数量
    int count = 0;

    //动态开辟的二维数组
    char* arr = NULL;

    scanf("%d %d", &n, &m);
    getchar();

    arr = (char*)calloc(n * m, sizeof(char));
    
    if (arr == NULL)
    {
        perror("calloc");
        return 1;
    }
    
    //录入数据
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            //存入第i行,第j列中
            //scanf录入时,前面+1个空格,可跳过空白字符录入
            scanf(" %c", arr + i * m + j);
        }
    }
    getchar();
    //处理数据
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            //如果此处不为雷,进入数雷阶段
            if (*(arr + i * m + j) != '*')
            {
                count = 0;

                for (x = i - 1; x <= i + 1; x++)
                {
                    //限制x范围,使其不得越界
                    if (x >= 0 && x < n)
                    {
                        for (y = j - 1; y <= j + 1; y++)
                        {
                            //限制y范围,使其不得越界,并数雷
                            if (y >= 0 && y < m && *(arr + x * m + y) == '*')
                            {
                                count++;
                            }
                        }
                    }
                }
                //打印雷的数量
                printf("%d", count);
            }
            else
            {
                printf("*");
            }
        }
        printf("\n");
    }

    free(arr);
    arr = NULL;

    return 0;
}

2、使用数组,且更改储存数据

#define _CRT_SECURE_NO_WARNINGS 1

#define ROWS 1000
#define COLS 1000

#include <stdio.h>
#include <assert.h>

int main()
{
    char arr[ROWS+2][COLS+2] = {0};
    int i = 0;
    int j = 0;
    int n = 0;
    int m = 0;
    int count = 0;

    scanf("%d %d", &n, &m);

    //录入数据
    //上下左右各空一行。以防止计算雷时,发生越界
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            scanf(" %c ", &arr[i][j]);//scanf录入时,前面+1个空格,可跳过空白字符录入
        }
    }

    //处理数据
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            if (arr[i][j] != '*')
            {
                count = 0;
                
				//数雷
                if (arr[i][j + 1] == '*')
                {
                    count++;
                }
                if (arr[i][j - 1] == '*')
                {
                    count++;
                }
                if (arr[i + 1][j] == '*')
                {
                    count++;
                }
                if (arr[i - 1][j] == '*')
                {
                    count++;

                }
                if (arr[i + 1][j + 1] == '*')
                {
                    count++;
                }
                if (arr[i + 1][j - 1] == '*')
                {
                    count++;
                }
                if (arr[i - 1][j + 1] == '*')
                {
                    count++;
                }
                if (arr[i - 1][j - 1] == '*')
                {
                    count++;
                }
                arr[i][j] = count + 48;//+48,使数字0变成字符'0'
            }
        }
    }

    //输出数据
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= m; j++)
        {
            printf("%c", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

运行结果:

C语言解题 || 扫雷_#include