让我们一起来玩扫雷游戏!
给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。
现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:
示例 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>& board,int x,int y)
{
if(true==judge(board,x,y) && 'E'==board[x][y])
{
int count=0;
vector> 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>& 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> updateBoard(vector>& board, vector& 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