• LeetCode 529 扫雷游戏


    LeetCode 529 扫雷游戏

    题目描述:
    让我们一起来玩扫雷游戏!
    给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。
    现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:

    • 如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。
    • 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的未挖出方块都应该被递归地揭露。
    • 如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。
    • 如果在此次点击中,若无更多方块可被揭露,则返回面板。

    执行用时:1 ms, 在所有 Java 提交中击败了81.17%的用户
    内存消耗:40.4 MB, 在所有 Java 提交中击败了12.68%的用户

    DFS

    class Solution {
        public char[][] updateBoard(char[][] board, int[] click) {
            //方向数组(顺时针): 上、右上、右、右下、下、左下、左、左上
            int[][] directs = new int[][]{
                {1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}
            };
            //点中地雷,修改后直接返回
            if(board[click[0]][click[1]]=='M') {
                board[click[0]][click[1]]='X';
                return board;
            }
            //点中方块,递归修改
            else if(board[click[0]][click[1]]=='E') {
                dfs(board, click, directs);
            }
    
            return board;
            
        }
    
        //深度遍历
        public void dfs(char[][] board, int[] axis, int[][] directs) {
            //坐标越界
            if(axis[0]<0 || axis[0]>=board.length || axis[1]<0 || axis[1]>=board[0].length ) {
                return;
            }
            //遇到已标记位置(地雷附近,不能再扩展)
            else if(Character.isDigit(board[axis[0]][axis[1]])) {
                return;
            }
            //遇到未标记的空方快'E'
            else if(board[axis[0]][axis[1]]=='E') {
                //判断是否在地雷附近,是则标记,否则修改为'B'并递归揭示所有相邻方块
                if(hasMine(board, axis, directs)) {
                    return;
                }
                board[axis[0]][axis[1]] = 'B';
                for(int[] direct:directs) {
                    dfs(board, new int[]{axis[0]+direct[0],axis[1]+direct[1]}, directs);
                }
            }
        }
    
        //判断board中点axis附近9个点内是否有地雷,并标记地雷数量
        public boolean hasMine(char[][] board, int[] axis, int[][] directs) {
            boolean flag = false;
            int count = 0;
            for(int[] direct:directs) {
                int nextRow = axis[0] + direct[0];
                int nextCol = axis[1] + direct[1];
                if(nextRow>=0 && nextRow<board.length && nextCol>=0 && nextCol<board[0].length && board[nextRow][nextCol]=='M') {
                    flag = true;
                    count++;
                }
            }
            //标记地雷数目
            if(flag) {
                board[axis[0]][axis[1]] = (char)('0'+count);
            }
            return flag;
        }
    }
    
  • 相关阅读:
    【QT 学习笔记】 一、 VS2015+ QT环境安装
    Ubuntu16.04 + caffe + cuda 环境搭建
    【Caffe学习笔记】一 、环境安装 Caffe + cuda + windows10 + VS2015 安装笔记, win7也适用
    【CNN】 吴恩达课程中几种网络的比较
    【图像处理】二 高斯滤波及其加速方法
    【图像处理 】 一、OSTU分割法
    1028: C语言程序设计教程(第三版)课后习题8.2
    函数和带参的宏,从三个数中找出最大的数
    Last Defence (run time error)
    Penalty
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13533426.html
Copyright © 2020-2023  润新知