zoukankan      html  css  js  c++  java
  • LeetCode529. 扫雷游戏




    直接按照题意进行深度优先搜索,只要当前位置不是地雷,且周围还存在方块可以揭露(搜索)时,就继续搜索,否则停止搜索,返回面板(board)。

    (1)如果搜到当前位置是地雷,那就修改为'X'。

    (2)用一个int变量cnt记录周围8个位置的地雷数量。
    (i)如果cnt不为0,说明周围有地雷,用对应的数字字符更新这个位置。
    (ii)如果cnt为0,说明当前位置是一个空白方块,则从这个空白方块周围八个位置继续往下揭露(搜索)。

    当莫得方块可以继续揭露时,返回面板。

    代码如下:

    class Solution {
    public:
        int n, m;
        int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
        int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
        vector<vector<bool>> visited;
    
        bool dfs(vector<vector<char>>& board, vector<vector<bool>>& visited, int x, int y) {            // dfs的返回值表示从坐标(x,y)的格子能否继续往下揭露格子
            visited[x][y] = true;
            if(board[x][y] == 'M') {            // 找到一个地雷,更新当前位置为'X'
                board[x][y] = 'X';
                return true;
            }
            int cnt = 0;                        // cnt记录(x,y)周围的地雷数量
            for(int i = 0; i < 8; ++i) {
                int newX = x + dx[i];
                int newY = y + dy[i];
                if(newX >= 0 && newX < n && newY >= 0 && newY < m && board[newX][newY] == 'M') {
                    ++cnt;
                }
            }
            if(cnt > 0) {                        // 如果周围有地雷,这将当前位置修改为地雷数量
                board[x][y] = '0' + cnt;
            } else {
                board[x][y] = 'B';                // 题目说了如果挖出一个空白方块被挖出,则需要递归地揭露与其相邻的方块
                for(int i = 0; i < 8; ++i) {
                    int newX = x + dx[i];
                    int newY = y + dy[i];
                    if(newX >= 0 && newX < n && newY >= 0 && newY < m && visited[newX][newY] == false && dfs(board, visited, newX, newY) == true) {
                        return true;
                    }
                }
            }
            return false;            
        }
    
        vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
            n = board.size();
            m = board[0].size();
            visited = vector<vector<bool>>(n, vector<bool>(m, false));
            dfs(board, visited, click[0], click[1]);
            return board;
        }
    };
    
  • 相关阅读:
    js node 操作
    深入认识javascript中的eval函数
    连接到网页objectivec
    web.config的数据库连接字符串进行加密
    fontsize和font标签的size属性的区别
    js改变背景图片
    MS:Chart:Series 成員 饼图 文字Label 显示在饼外
    读取plist文件
    js判断undefined类型
    当用updatepanel和scriptmanager时,弹出框
  • 原文地址:https://www.cnblogs.com/linrj/p/13972938.html
Copyright © 2011-2022 走看看