529. 扫雷游戏 - 8月20日

题目

529. 扫雷游戏

我的思路

深搜:
如果点击的方块是‘M’,那么直接修改为X,并返回;
如果点击的方块是‘E’,先判断周围有多少个M,如果有n个,那么把字符修改为‘n’;如果n是0,那么对周围的个方块依次重复“深搜”,并修改为‘B’。
返回

时间复杂度和空间复杂度都是Omn也就是矩阵大小

我的实现

class Solution {
public:
    void count(vector<vector<char>>& board, vector<int>& click){
        vector<int> x = {0,0,1,1,1,-1,-1,-1};
        vector<int> y = {1,-1,0,1,-1,0,1,-1};
        int result= 0;
        for(int i=0;i<8;i++){
            if((x[i]+click[0])>=0&&(x[i]+click[0])<board.size()&&(click[1]+y[i])>=0&&(click[1]+y[i])<board[0].size()){
                if(board[(x[i]+click[0])][(y[i]+click[1])]=='M'){
                    result++;
                }
            }
        }
        if (result==0){
            for(int i=0;i<8;i++){
            if((x[i]+click[0])>=0&&(x[i]+click[0])<board.size()&&(click[1]+y[i])>=0&&(click[1]+y[i])<board[0].size()){
                if(board[(x[i]+click[0])][(y[i]+click[1])]=='E'){
                    vector<int> temp = {(x[i]+click[0]),(y[i]+click[1])};
                    dpSearch(board,temp);
                }
            }
        }
            board[click[0]][click[1]]='B';
        }else{
            board[click[0]][click[1]]=result+'0';
        }
    }
    void dpSearch(vector<vector<char>>& board, vector<int>& click){
        if(click[0]<board.size()&&click[0]>=0&&click[1]>=0&&click[1]<board[0].size()){
            if(board[click[0]][click[1]]=='M'){
                board[click[0]][click[1]] = 'X';
                return;
            }else{
                if(board[click[0]][click[1]]=='E'){
                     board[click[0]][click[1]]='T';
                   count(board,click);
                }
            }

        }
    }
    vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
        dpSearch(board,click);
        return board;
    }

};

 

拓展学习

借助队列使用广搜也可以,当四周不存在地雷时,把四周的节点加入到队列中。

 

posted on 2020-08-20 14:37  BoysCryToo  阅读(173)  评论(0编辑  收藏  举报

导航