[leetcode] 529. Minesweeper
描述
就是大家都玩过的扫雷游戏
题目链接529. Minesweeper
分析
题目很简单,读懂规则就好,只用点击一次,而且给你的输入要么是点击’M’,要么是’E’。’M’的处理很简单。
碰到’E’的处理:
1.首先统计周围8领域有没有地雷,如果有,则置为相应的数目,返回;
2.如果周围没有地雷,对领域点深搜,还是依照这个规则。
我的代码
class Solution {
public:
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
if (board[click[0]][click[1]]=='M')
{
board[click[0]][click[1]]='X';
return board;
}
else
{
int len=board.size();
int wid=board[0].size();
int neig[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int sumMine=0;
for (int i=0; i<8; i++)
{
int indI=click[0]+neig[i][0];
int indJ=click[1]+neig[i][1];
if (indI>=0 && indI<len && indJ>=0 && indJ<wid)
{
sumMine+=(board[indI][indJ]=='M')?1:0;
}
}
if (!sumMine)
{
board[click[0]][click[1]]='B';
for (int i=0; i<8; i++)
{
int indI=click[0]+neig[i][0];
int indJ=click[1]+neig[i][1];
vector<int> clk;
clk.push_back(indI);
clk.push_back(indJ);
if (indI>=0 && indI<len && indJ>=0 && indJ<wid)
{
dfs(board,clk);
}
}
}
else board[click[0]][click[1]]='0'+sumMine;
}
return board;
}
private:
void dfs(vector<vector<char>>& board, vector<int>& click)
{
if (board[click[0]][click[1]]!='E')
{
return ;
}
else
{
int len=board.size();
int wid=board[0].size();
int neig[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int sumMine=0;
for (int i=0; i<8; i++)
{
int indI=click[0]+neig[i][0];
int indJ=click[1]+neig[i][1];
if (indI>=0 && indI<len && indJ>=0 && indJ<wid)
{
sumMine+=((board[indI][indJ]=='M')?1:0);
}
}
if (!sumMine)
{
board[click[0]][click[1]]='B';
for (int i=0; i<8; i++)
{
int indI=click[0]+neig[i][0];
int indJ=click[1]+neig[i][1];
vector<int> clk;
clk.push_back(indI);
clk.push_back(indJ);
if (indI>=0 && indI<len && indJ>=0 && indJ<wid)
{
dfs(board,clk);
}
}
}
else
board[click[0]][click[1]]='0'+sumMine;
}
}
};