暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【85】扫雷游戏

皮皮克克 2023-11-22
6

点击关注公众号,干货第一时间送达


扫雷游戏,

大家都玩过吧?

没玩过的,起来罚站啊你

罚你赶紧去玩两把,

不然这道题,

你理解起来没那么快。

这款游戏诞生的挺早的,1992年出来的,

比小编我的年龄都大很多

比屏幕前的你。。。我就不知道了

原理类似于前面的文章:

数据结构和算法【84】被围绕的区域

数据结构和算法【80】省份数量

属于图的连通性问题。

不难,

但是coding ,需要注意点细节。

题目来自力扣:

原题链接:

https://leetcode.cn/problems/minesweeper/description/


一、屏幕前的吴彦祖和刘亦菲们,请听题

题目可真长

举个例子:


玩过游戏的小伙伴,

肯定不用看题目就知道。

没玩过的小伙伴们,

看两遍就明白了。

不难解。


二、解题

其实,每个点位的情况不多,

初始给定的矩阵board[][],

没有地雷的地方用 'E' 表示,有地雷的用 'M' 表示:

给你一次点击 click 的机会,点击 board[x,y] 位置,

然后把点击后的结果展示即可。


代码的开始,

(1)我们肯定是要先判断这次点击是不是正好点中了地雷,

如果是,则游戏直接结束了:

不是的话。

(2)判断当前点(x,y)周围有多少个地雷

怎么遍历?则深度遍历,

去判断这个点(x,y)四周其他8个点:

代码中,为了方便遍历这8个点,用坐标转换:

找到后修改即可。

看看代码。



完整代码:

public class CodingDemo_03 {

    /**
     * 扫雷游戏
     * @param board
     * @param click
     * @return
     */

    public char[][] updateBoard(char[][] board, int[] click) {
        int x = click[0];
        int y = click[1];
        //1,如果点击的地方刚好是地雷,则游戏结束
        if (board[x][y] == 'M'){
            board[x][y] = 'X';
        } else {
            //2,否则,深度遍历
            process(board, x, y);
        }
        return board;
    }

    //(x,y)这个点位的四周8个点
    private static int[] xdir = {-1,-1,-1,0,1,1,1,0};
    private static int[] ydir = {-1,0,1,1,1,0,-1,-1};

    private void process(char[][] board, int x, int y) {
        //因为只点击一次,第一次点击中地雷的情况被排除了
        //该方法中,我们需要处理其他情况,
        //(x,y)这个位置应该是空白‘B’,
        // 还是说四周一共8个位置可能有地雷,是数字模块
        //需要分开讨论

        int mineNum = 0//地雷数量

        int M = board.length;
        int N = board[0].length;

        //判断当前点(x,y)四周其他8个点
        for (int i = 0; i < 8; i++) {
            int newX = x + xdir[i];
            int newY = y + ydir[i];

            if (newX >= 0 && newX < M && newY >= 0 && newY < N && board[newX][newY] == 'M'){
                mineNum++; //地雷增加
            }
        }

        if (mineNum > 0){
            //当前点(x,y)周围有地雷,
            //修改为数字
            board[x][y] = (char) (mineNum + '0');
        } else {
            //周围没有地雷
            //直接修改为 B
            board[x][y] = 'B';

            //扩展
            for (int i = 0; i < 8; i++) {
                int newX = x + xdir[i];
                int newY = y + ydir[i];

                if (newX < 0 || newX >= M || newY < 0 || newY >= N ||
                        board[newX][newY] == 'B'){
                    continue;
                }
                process(board, newX, newY);
            }
        }
    }
}

去力扣试试:



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论