题目描述
扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相邻的单元格。 0<n,m<=100
输入描述
输入包含若干个矩阵,对于每个矩阵,第一行包含两个整数n和m,分别表示这个矩阵的行数和列数。接下来n行每行包含m个字符。安全区域用‘.’表示,有地雷区域用’*'表示。当n=m=0时输入结束。
输出描述
对于第i个矩阵,首先在单独的一行里打印序号:“Field #i:”,接下来的n行中,读入的’.'应被该位置周围的地雷数所代替。输出的每两个矩阵必须用一个空行隔开。
输入样例
4 4
…
…
.…
…
3 5
**…
…
.*…
0 0
输出样例
Field #1:
100
2210
110
1110
Field #2:
**100
33200
1*100
代码展示
#include <iostream>
using namespace std;
int main()
{
int n, m, ans[150][150], cnt = 0;
char a[150][150];
while (cin >> n >> m)
{
fill(a[0], a[0] + 150 * 150, '.');
fill(ans[0], ans[0] + 150 * 150, -1);
if (n == 0 && m == 0) break;
printf("Field #%d:\n", ++cnt);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf(" %c ", &a[i][j]);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] == '.')
{
int sum = 0;
if (a[i][j + 1] == '*') sum++;
if (a[i][j - 1] == '*') sum++;
if (a[i + 1][j] == '*') sum++;
if (a[i - 1][j] == '*') sum++;
if (a[i + 1][j + 1] == '*') sum++;
if (a[i + 1][j - 1] == '*') sum++;
if (a[i - 1][j + 1] == '*') sum++;
if (a[i - 1][j - 1] == '*') sum++;
a[i][j] = sum + '0';
}
cout << a[i][j];
}
cout << endl;
}
cout << endl;
}
return 0;
}
所用知识
1.扫雷的主要问题就是判断周围雷的个数
a[i][j]表示雷区中的一个位置,那么就判断周围雷的个数
a[i-1][j-1],a[i-1][j],a[i-1][j+1],a[i][j-1],a[i][j+1],a[i+1][j-1],a[i+1][j],a[i+1][j+1];
即左上,上,右上,左,右,左下,右下。八个方位的位置。
接下来,判断该位置周围是否越界。
即:0<= i <n, 0<= j <m;
2.每个区都是 由 周围相邻的几个区 给的贡献值的叠加。 边输入边更新的方式 就得到答案
细节之处
运用到了二阶行列式,以下是关于他的一些知识点:
1.在编程中矩阵是用数组来表示的
2.关于矩阵位置中的判断可以用两个循环来套用来到达任何一点
3.百度后关于矩阵的基本定义讲解
欢迎批评指正:)