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;
        }
    };
    
  • 相关阅读:
    [转]使用Java Mission Control进行内存分配分析
    JDE开发端安装问题(JDE初步卸载重装)
    JDE开发端安装笔记
    [转]JDE910--jas.ini参数说明
    [转]十个常见的缓存使用误区及建议
    JDE910笔记2--OMW项目建立及简单使用
    JDE910笔记1--基础介绍及配置
    [转] 编程之美--字符串移位包含的问题
    关于JDBC
    [转]何时使用委托而不使用接口(C# 编程指南)
  • 原文地址:https://www.cnblogs.com/linrj/p/13972938.html
Copyright © 2011-2022 走看看