1. 题⽬链接:529.扫雷游戏
2. 题⽬描述:
3. 解法:
算法思路:
模拟类型的dfs 题⽬。
⾸先要搞懂题⽬要求,也就是游戏规则。
从题⽬所给的点击位置开始,根据游戏规则,来⼀次dfs 即可。
C++算法代码:
class Solution
{
public:
int dx[8] = { -1,-1,-1,0,0,1,1,1 };
int dy[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int temp[50][50] = { 0 }; //状态数组
int m,n;
void dfs(vector<vector<char>>& board, int x, int y)
{
int count = 0;
//点到炸弹
if(board[x][y]=='M')
{
board[x][y]='X';
return;
}
//计算周围的地雷数
for (int i = 0; i < 8; i++)
{
int X = x + dx[i], Y = y + dy[i];
//合法性判断
if (X < 0 || X >= m || Y < 0 || Y >= n)
{
continue;
}
//修改值
if (board[X][Y] == 'M')
{
count++;
}
}
//有地雷,将此处改为地雷数
if (count != 0)
{
board[x][y] = '0' + count;
return;
}
//没有地雷,将周围所有的位置改为B
else
{
board[x][y] = 'B';
for (int i = 0; i < 8; i++)
{
int X = x + dx[i], Y = y + dy[i];
//合法性判断
if (X < 0 || X >= m || Y < 0 || Y >= n || temp[X][Y])
{
continue;
}
//修改值
board[X][Y] = 'B';
temp[X][Y] = 1;
dfs(board, X, Y);
}
}
}
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
{
m=board.size(),n=board[0].size();
dfs(board, click[0], click[1]);
return board;
}
};
Java算法代码:
class Solution
{
int[] dx = { 0, 0, 1, -1, 1, 1, -1, -1 };
int[] dy = { 1, -1, 0, 0, 1, -1, 1, -1 };
int m, n;
public char[][] updateBoard(char[][] board, int[] click)
{
m = board.length; n = board[0].length;
int x = click[0], y = click[1];
if (board[x][y] == 'M') // 如果直接点到地雷,游戏结束
{
board[x][y] = 'X';
return board;
}
dfs(board, x, y);
return board;
}
public void dfs(char[][] board, int i, int j)
{
// 统计⼀下周围地雷的个数
int count = 0;
for (int k = 0; k < 8; k++)
{
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'M')
{
count++;
}
}
if (count == 0) // 周围没有地雷
{
board[i][j] = 'B';
for (int k = 0; k < 8; k++)
{
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'E')
{
dfs(board, x, y);
}
}
}
else
{
board[i][j] = (char)('0' + count);
return;
}
}
}