题目:
小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;
}