本文最后更新于 1649 天前,其中的信息可能已经有所发展或是发生改变。
此题可巩固字符串和二维数组,加上函数解题更妙~
描述
你玩过扫雷游戏吗?这个可爱的小游戏附带了某个操作系统,我们记不起名字了。游戏的目标是在M × N字段中找到所有地雷的位置。游戏显示一个正方形中的数字,它会告诉你那个正方形附近有多少个地雷。每个正方形最多有八个相邻的正方形。左边的4×4字段包含两个地雷,每个地雷都用“*”字符表示。
输入
输入将由任意数量的字段组成。每个字段的第一行包含两个整数n和m(0<n,m<100),分别代表字段的行数和列数。接下来的n行中每行都包含恰好m个字符,表示字段。安全方块以“.”表示,地雷方块以“*”表示,两者都没有引号。n = m = 0 的第一个字段行表示输入的结束,不应处理。
输出
对于每个字段,打印消息“Field #x:”仅在一行上,其中x代表从1开始的字段数。接下来的n行应该包含字段,字段的“.”字符替换为该正方形附近的地雷数量。每一段输出之间必须有一条空行。
样例输入
4 4 *... .... .*.. .... 3 5 **... ..... .*... 0 0
样例输出
Field #1: *100 2210 1*10 1110 Field #2: **100 33200 1*100
#include <stdio.h>
char translate(int n)
{
if (n == 1) return '1';
if (n == 2) return '2';
if (n == 3) return '3';
if (n == 4) return '4';
if (n == 5) return '5';
if (n == 6) return '6';
if (n == 7) return '7';
if (n == 8) return '8';
if (n == 9) return '9';
if (n == 0) return '0';
}
int main()
{
char arr[100][100];
int m, n;
int i, j;
int jsq = 0;
int jc = 0;
while (scanf("%d%d", &m, &n), m || n)
{
jc++;
for (i = 0; i < m; i++)
{
scanf("%s", arr[i]);
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (arr[i][j] == '*')
{
continue;
}
else
{
jsq = 0;
if (i - 1 >= 0 && j - 1 >= 0 && arr[i - 1][j - 1] == '*')
jsq++;
if (i - 1 >= 0 && arr[i - 1][j] == '*')
jsq++;
if (i - 1 >= 0 && j + 1 >= 0 && arr[i - 1][j + 1] == '*')
jsq++;
if (j - 1 >= 0 && arr[i][j - 1] == '*')
jsq++;
if (j + 1 >= 0 && arr[i][j + 1] == '*')
jsq++;
if (i + 1 >= 0 && j - 1 >= 0 && arr[i + 1][j - 1] == '*')
jsq++;
if (i + 1 >= 0 && arr[i + 1][j] == '*')
jsq++;
if (i + 1 >= 0 && j + 1 >= 0 && arr[i + 1][j + 1] == '*')
jsq++;
arr[i][j] = translate(jsq);
}
}
}
printf("Field #%d:\n", jc);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}