• 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;
    }
  • 相关阅读:
    如何增加VM Ware虚拟机的硬盘空间
    安装完成oracle 11g R2 后,使用sqlplus 报错"sqlplus: error while loading shared libraries" ...
    listener.ora
    ExtJS项目框架有关问题讨论
    Oracle启动监听报错:The listener supports no services解决
    Linq学习笔记一
    PAT 1054 The Dominant Color[简单][运行超时的问题]
    Andrew NgML第十八章大规模机器学习
    PAT 1042 Shuffling Machine[难]
    PAT 1103 Integer Factorization[难]
  • 原文地址:https://www.cnblogs.com/zmmm/p/13648723.html
Copyright © 2020-2023  润新知