76扫雷游戏(529)

作者: Turbo时间限制: 1S章节: 宽度优先搜索

晚于: 2020-08-26 12:00:00后提交分数乘系数50%

截止日期: 2020-09-02 12:00:00

问题描述 :

让我们一起来玩扫雷游戏!

给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。

现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:

如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。

如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的未挖出方块都应该被递归地揭露。

如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。

如果在此次点击中,若无更多方块可被揭露,则返回面板。

示例 1:

输入: 

[['E', 'E', 'E', 'E', 'E'],

 ['E', 'E', 'M', 'E', 'E'],

 ['E', 'E', 'E', 'E', 'E'],

 ['E', 'E', 'E', 'E', 'E']]

Click : [3,0]

输出: 

[['B', '1', 'E', '1', 'B'],

 ['B', '1', 'M', '1', 'B'],

 ['B', '1', '1', '1', 'B'],

 ['B', 'B', 'B', 'B', 'B']]

解释:

示例 2:

输入: 

[['B', '1', 'E', '1', 'B'],

 ['B', '1', 'M', '1', 'B'],

 ['B', '1', '1', '1', 'B'],

 ['B', 'B', 'B', 'B', 'B']]

Click : [1,2]

输出: 

[['B', '1', 'E', '1', 'B'],

 ['B', '1', 'X', '1', 'B'],

 ['B', '1', '1', '1', 'B'],

 ['B', 'B', 'B', 'B', 'B']]

解释:

注意:

输入矩阵的宽和高的范围为 [1,50]。

点击的位置只能是未被挖出的方块 ('M' 或者 'E'),这也意味着面板至少包含一个可点击的方块。

输入面板不会是游戏结束的状态(即有地雷已被挖出)。

简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。

可使用以下main函数:

int main()

{

    vector<vector<char> > board;

    int m,n,x,y;

    cin>>m;

    cin>>n;

    char ch;

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

    {

        vector<char> aLine;

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

        {

            cin>>ch;

            aLine.push_back(ch);

        }

        board.push_back(aLine);

    }

    cin>>x>>y;

    vector<int> click;

    click.push_back(x);

    click.push_back(y);

    vector<vector<char>> res=Solution().updateBoard(board,click);

    for(int i=0; i<res.size(); i++)

    {

        vector<char> aLine = res[i];

        for(int j=0; j<aLine.size(); j++)

            cout<<aLine[j];

        cout<<endl;

    }

    return 0;

}

输入说明 :

首先输入矩阵的高度m和宽度n,它们的范围为 [1,50]

然后输入m行,每行n个字符,字符的含义见描述。

最后输入两个整数,表示点击的位置行、列坐标。

输出说明 :

输出最后矩阵的状态

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

class Solution {
public:
    const int dx[8]={0,0,1,1,1,-1,-1,-1};
    const int dy[8]={1,-1,-1,0,1,-1,0,1};
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) 
    {
        int x=click[0],y=click[1];
        if(board[x][y]=='M')//如果是M。直接修改成X,返回 
        {
            board[x][y]='X';
            return board;
        }
        queue<pair<int,int>> Q;
        Q.push({x,y});
        board[x][y]='B';//先把值赴成B 
        int m=board.size(),n=board[0].size();
        while(!Q.empty())//宽度搜索 
        {
            pair<int,int> front=Q.front();
            Q.pop();
            int count=0;
            for(int i=0;i<8;i++) 
            {
                int newx=front.first+dx[i];
                int newy=front.second+dy[i];
                if(newx>=0&&newx<m&&newy>=0&&newy<n&&board[newx][newy]=='M')//判断出队列的附近有没有'M',有的话个数加1 
                    count++;
            }
            if(count==0)//如果附近没有雷,进行宽度有限搜索八个方向的 
            {
                for(int i=0;i<8;i++) 
                {
                int newx=front.first+dx[i];
                int newy=front.second+dy[i];
                if(newx>=0&&newx<m&&newy>=0&&newy<n&&board[newx][newy]=='E')
                {
                    board[newx][newy]='B';
                    Q.push({newx,newy})    ;
                }
                }
            }
            else//如果附近有雷,把个数改成雷的个数 
                board[front.first][front.second]='0'+count;
        }
        return board;
    }
};
    

int main()
{
    vector<vector<char> > board;
    int m,n,x,y;
    cin>>m;
    cin>>n;

    char ch;
    for(int i=0; i<m; i++)
    {
        vector<char> aLine;
        for(int j=0; j<n; j++)
        {
            cin>>ch;
            aLine.push_back(ch);
        }
        board.push_back(aLine);
    }
    cin>>x>>y;
    vector<int> click;
    click.push_back(x);
    click.push_back(y);
    vector<vector<char>> res=Solution().updateBoard(board,click);
    for(int i=0; i<res.size(); i++)
    {
        vector<char> aLine = res[i];
        for(int j=0; j<aLine.size(); j++)
            cout<<aLine[j];
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zmmm/p/13648723.html