[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;
}
}
};