LeetCode 529. 掃雷遊戲(C++、python)
阿新 • • 發佈:2018-12-16
讓我們一起來玩掃雷遊戲!
給定一個代表遊戲板的二維字元矩陣。 'M' 代表一個未挖出的地雷,'E' 代表一個未挖出的空方塊,'B' 代表沒有相鄰(上,下,左,右,和所有4個對角線)地雷的已挖出的空白方塊,數字('1' 到 '8')表示有多少地雷與這塊已挖出的方塊相鄰,'X' 則表示一個已挖出的地雷。
現在給出在所有未挖出的方塊中('M'或者'E')的下一個點選位置(行和列索引),根據以下規則,返回相應位置被點選後對應的面板:
- 如果一個地雷('M')被挖出,遊戲就結束了- 把它改為 'X'。
- 如果一個沒有相鄰地雷
- 如果一個至少與一個地雷相鄰的空方塊('E')被挖出,修改它為數字('1'到'8'),表示相鄰地雷的數量。
- 如果在此次點選中,若無更多方塊可被揭露,則返回面板。
示例 1:
輸入: [['E', 'E', 'E', 'E', 'E'], ['E', 'E', 'M', 'E', 'E'], ['E', 'E', 'E', 'E', 'E'], ['E', 'E', 'E', 'E', 'E']] Click : [3,0] 輸出: [['B', '1', 'E', '1', 'B'], ['B', '1', 'M', '1', 'B'], ['B', '1', '1', '1', 'B'], ['B', 'B', 'B', 'B', 'B']] 解釋:
示例 2:
輸入: [['B', '1', 'E', '1', 'B'], ['B', '1', 'M', '1', 'B'], ['B', '1', '1', '1', 'B'], ['B', 'B', 'B', 'B', 'B']] Click : [1,2] 輸出: [['B', '1', 'E', '1', 'B'], ['B', '1', 'X', '1', 'B'], ['B', '1', '1', '1', 'B'], ['B', 'B', 'B', 'B', 'B']] 解釋:
注意:
輸入矩陣的寬和高的範圍為 [1,50]。
點選的位置只能是未被挖出的方塊 ('M' 或者 'E'),這也意味著面板至少包含一個可點選的方塊。
輸入面板不會是遊戲結束的狀態(即有地雷已被挖出)。
簡單起見,未提及的規則在這個問題中可被忽略。例如,當遊戲結束時你不需要挖出所有地雷,考慮所有你可能贏得遊戲或標記方塊的情況。
C++
class Solution {
public:
void DFS(vector<vector<char>>& board,int x,int y)
{
if(true==judge(board,x,y) && 'E'==board[x][y])
{
int count=0;
vector<vector<int>> vec={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
for(auto ele:vec)
{
int i=x+ele[0];
int j=y+ele[1];
if((true==judge(board,i,j)) && 'M'==board[i][j])
{
count++;
}
}
if(count>0)
{
board[x][y]='0'+count;
}
else
{
board[x][y]='B';
for(auto ele:vec)
{
int i=x+ele[0];
int j=y+ele[1];
DFS(board,i,j);
}
}
}
}
bool judge(vector<vector<char>>& board,int row,int col)
{
int m=board.size();
int n=board[0].size();
if(row<0 || row>=m || col<0 || col>=n)
{
return false;
}
else
{
return true;
}
}
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click)
{
int m=board.size();
int n=board[0].size();
int x=click[0];
int y=click[1];
if('M'==board[x][y])
{
board[x][y]='X';
}
else
{
DFS(board,x,y);
}
return board;
}
};
python
class Solution:
def DFS(self,board,row,col):
if True==self.judge(board,row,col) and 'E'==board[row][col]:
count=0
vec=[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
for ele in vec:
i=row+ele[0]
j=col+ele[1]
if True==self.judge(board,i,j) and 'M'==board[i][j]:
count+=1
if count>0:
board[row][col]=str(count)
else:
board[row][col]='B'
for ele in vec:
i=row+ele[0]
j=col+ele[1]
board=self.DFS(board,i,j)
return board
def judge(self,board,row,col):
m=len(board)
n=len(board[0])
if row<0 or row>=m or col<0 or col>=n:
return False
else:
return True
def updateBoard(self, board, click):
"""
:type board: List[List[str]]
:type click: List[int]
:rtype: List[List[str]]
"""
m=len(board)
n=len(board[0])
i=click[0]
j=click[1]
if 'M'==board[i][j]:
board[i][j]='X'
else:
board=self.DFS(board,i,j)
return board