扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。
玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。
现在给出n行m列的雷区中的地雷分布,请计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子
方法一:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n, m;
char str1[200][200];
cin >> n >> m;
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
str1[i][j] = '?';
}
}
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <=m; j++)
{
cin >> str1[i][j];
}
}
char str2[200][200] = { 0 };
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (str1[i][j] == '*')
str2[i][j] = '*';
else
{
if (str1[i - 1][j - 1] == '*')
str2[i][j]++;
if (str1[i - 1][j] == '*')
str2[i][j]++;
if (str1[i - 1][j + 1] == '*')
str2[i][j]++;
if (str1[i][j - 1] == '*')
str2[i][j]++;
if (str1[i][j + 1] == '*')
str2[i][j]++;
if (str1[i + 1][j - 1] == '*')
str2[i][j]++;
if (str1[i + 1][j] == '*')
str2[i][j]++;
if (str1[i + 1][j + 1] == '*')
str2[i][j]++;
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (str2[i][j] == '*')
printf("*");
else
printf("%d", str2[i][j]);
}
printf("\n");
}
return 0;
}
值得注意的是,在该方法中,对于非输入的二维数组范围,可以全部初始化为'?',来避免其他非输入部分的影响。
方法二 :
#include <stdio.h>
int main()
{
int n, m;
scanf("%d %d",&n, &m);
char mine[101][101];
int dx[] = {-1,-1,-1,0,0,1,1,1};
int dy[] = {-1,0,1,-1,1,-1,0,1};
for (int i = 0;i < n;i++)
{
scanf("%s", mine[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (mine[i][j] == '?')
{
int count = 0;
for (int k = 0; k < 8; k++)
{
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && x < n && y >= 0 && y < m && mine[x][y] == '*')
{
count++;
}
}
printf("%d", count);
}
else
{
printf("%c", mine[i][j]);
}
}
printf("\n");
}
return 0;
}