記事ディレクトリ
件名:529.地雷除去ゲーム
一緒にマインスイーパゲームをプレイしましょう!
ゲームボードを表す2次元のキャラクターマトリックスが与えられます。「M」は未使用の地雷を表し、「E」は掘られていない空の広場を表し、「B」は隣接していない地雷(上、下、左、右、すべての4つの対角線)を表します。掘り出された空白の正方形の場合、数字(「1」から「8」)はこの掘り込みブロックに隣接する鉱山の数を示し、「X」は掘り出された鉱山を意味します。
次に、次のルールに従って、掘られていないすべての正方形(「M」または「E」)の次のクリック位置(行と列のインデックス)を指定し、対応する位置をクリックした後に対応するパネルに戻ります。
地雷(「M」)が掘り出された場合、ゲームは「X」に変更されます。
隣接する地雷のない空のブロック( 'E')が掘り出された場合、それを( 'B')に変更し、隣接するすべての掘られていないブロックを再帰的に明らかにする必要があります。
少なくとも1つの地雷に隣接する空の正方形( 'E')が掘り出されている場合は、隣接する地雷の数を示す数値( '1'〜 '8')に変更します。
このクリック中に表示するマスがなくなったら、パネルに戻ります。
例1:
入る:
[['E'、 'E'、 'E'、 'E'、 'E']、
['E'、 'E'、 'M'、 'E'、 'E']、
['E'、 'E'、 'E'、 'E'、 'E']、
['E'、 'E'、 'E'、 'E'、 'E']]
クリック:[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」]]
クリック:[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')のみです。これは、パネルに少なくとも1つのクリック可能なブロックが含まれていることも意味します。
- 入力パネルは、ゲームが終了した状態(つまり、地雷が掘り出された状態)にはなりません。
- 簡単にするために、この質問では言及されていないルールは無視できます。たとえば、ゲームが終わったときにすべての地雷を掘り下げる必要はありません。ゲームに勝ったり、四角にマークを付けたりするすべての状況を考慮してください。
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/minesweeper
著作権はLeetCode が所有しています。商用転載については、正式な許可書にご連絡ください。非商用転載については、出典を明記してください。
基本的な考え方:DFS
class Solution {
public:
int row, col;
vector<vector<int>> dir;
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
dir = {
{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
row = board.size();
if(row == 0)
return board;
col = board[0].size();
dfs(board, click[0], click[1]);
return board;
}
void dfs(vector<vector<char>> &board, int x, int y){
if(board[x][y] == 'X' || (board[x][y] >= '1' && board[x][y] <= '8'))
return;
if(board[x][y] == 'M'){
board[x][y] = 'X';
return;
}
if(board[x][y] == 'E'){
int cnt = 0;
for(auto d : dir){
int cx = x + d[0];
int cy = y + d[1];
if(judge_pos(cx, cy) && (board[cx][cy] == 'M' || board[cx][cy] == 'X') )
++cnt;
}
if(cnt == 0){
board[x][y] = 'B';
for(int i = 0; i < 8; ++i){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(judge_pos(tx, ty))
dfs(board, tx, ty);
}
}
else{
board[x][y] = ('0' + cnt);
}
}
}
bool judge_pos(int x, int y){
return x >= 0 && x < row && y >= 0 && y < col;
}
};
もちろん、この質問にはbfsを使用することもできます