蓝桥杯练习系统:扫雷

题目描述

扫雷游戏你一定玩过吧!现在给你若干个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
1
10
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.百度后关于矩阵的基本定义讲解
请添加图片描述

欢迎批评指正:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值