Minesweeper 蓝桥杯 扫雷游戏(化繁为简)(摒弃多层循环)

题目描述
Minesweeper Have you ever played Minesweeper? This cute little game comes with a certain operating system whose name we can't remember. The goal of the game is to find where all the mines are located within a M x N field. The game shows a number in a square which tells you how many mines there are adjacent to that square. Each square has at most eight adjacent squares. The 4 x 4 field on the left contains two mines, each represented by a ``*'' character. If we represent the same field by the hint numbers described above, we end up with the field on the right: *... .... .*.. .... *100 2210 1*10 1110

输入

The input will consist of an arbitrary number of fields. The first line of each field contains two integers n and m ( 0 < n, m$ \le$100) which stand for the number of lines and columns of the field, respectively. Each of the next n lines contains exactly m characters, representing the field. Safe squares are denoted by ``.'' and mine squares by ``*,'' both without the quotes. The first field line where n = m = 0 represents the end of input and should not be processed.

输出

For each field, print the message Field #x: on a line alone, where x stands for the number of the field starting from 1. The next n lines should contain the field with the ``.'' characters replaced by the number of mines adjacent to that square. There must be an empty line between field outputs.

样例输入

4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0

样例输出

Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100

解题思路:本质上其实就是扫雷游戏,摒弃原有多层判断(四角、边缘、内部)。

              换一种思路:既然是计算周围九宫格的雷数,就应该想到只要遍历对应元素周围(行差<=1 && 列差<=1)同时字符=='*'即可

参考代码:
#include<iostream>

#include<cmath>

#define maxn 105

using namespace std;

void printScreen(char (*result)[maxn], int m, int n, int num);

int main()

{

    int a,b;

    int num=0;

    char mineWeeper[maxn][maxn];

    char mineResult[maxn][maxn];  //存储结果

    while(cin>>a>>b && a!=0 && b!=0){

        num++;

        for(int i=0; i<a; i++){

            for(int j=0; j<b; j++){

                cin >> mineWeeper[i][j];

            }

        }

        int y=0,x=0;

        while(y<a && x<b){

            int cnt=0; //雷数

            if(mineWeeper[y][x] == '*') mineResult[y][x] = '*';

            else{

                for(int i=0; i<a; i++){

                for(int j=0; j<b; j++){

                    if(abs(i-y)<=1 && abs(j-x)<=1 && mineWeeper[i][j]=='*') cnt++;

                }

                }

                mineResult[y][x] = cnt+'0';

            }

            if(x+1>=b){

                y++;

                x = 0;

            }else x++;

        }

        printScreen(mineResult, a, b, num);

    }

      

    return 0;

}

void printScreen(char (*result)[maxn], int m, int n, int num){

    cout << "Field #" << num << ":" <<endl;

    for(int i=0; i<m; i++){

        for(int j=0; j<n; j++){

            cout << result[i][j];

            if(j == n-1) cout<<'\n';

        }

    }

    cout<<'\n';

}

posted @ 2022-03-02 17:29  suinis  Views(66)  Comments(0)    收藏  举报