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

扫雷游戏,
大家都玩过吧?
没玩过的,起来罚站啊你
,
罚你赶紧去玩两把,
不然这道题,
你理解起来没那么快。

这款游戏诞生的挺早的,1992年出来的,
比小编我的年龄都大很多
比屏幕前的你。。。我就不知道了
原理类似于前面的文章:
属于图的连通性问题。
不难,
但是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);
}
}
}
}
去力扣试试:


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




