Skip to content

Commit 618b3ce

Browse files
committed
Add a solution to Minesweeper
1 parent bd7d3c4 commit 618b3ce

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

DFS/Minesweeper.swift

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Question Link: https://leetcode.com/problems/minesweeper/
3+
* Primary idea: Classic Depth-first Search. Check current node and dfs all directions if mine count is 0, update the board accordingly.
4+
*
5+
* Time Complexity: O(mn), Space Complexity: O(mn)
6+
*
7+
*/
8+
9+
class Minesweeper {
10+
private let dirs = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (-1, 1), (1, -1), (-1, -1)]
11+
12+
func updateBoard(_ board: [[Character]], _ click: [Int]) -> [[Character]] {
13+
let i = click[0], j = click[1]
14+
var board = board
15+
16+
if board[i][j] == "M" {
17+
board[i][j] = "X".first!
18+
return board
19+
}
20+
21+
let m = board.count, n = board[0].count
22+
var isVisited = Array(repeating: Array(repeating: false, count: n), count: m)
23+
24+
dfs(&board, i, j, &isVisited)
25+
26+
return board
27+
}
28+
29+
private func dfs(_ board: inout [[Character]], _ i: Int, _ j: Int, _ isVisited: inout [[Bool]]) {
30+
guard isValid(i, j, board) && !isVisited[i][j] else {
31+
return
32+
}
33+
34+
isVisited[i][j] = true
35+
36+
if board[i][j] == "E" {
37+
var count = 0
38+
for dir in dirs {
39+
let x = i + dir.0, y = j + dir.1
40+
41+
if isValid(x, y, board) {
42+
if board[x][y] == "X" || board[x][y] == "M" {
43+
count += 1
44+
}
45+
}
46+
}
47+
48+
if count == 0 {
49+
board[i][j] = "B".first!
50+
51+
for dir in dirs {
52+
let x = i + dir.0, y = j + dir.1
53+
dfs(&board, x, y, &isVisited)
54+
}
55+
} else {
56+
board[i][j] = String(count).first!
57+
}
58+
}
59+
}
60+
61+
private func isValid(_ i: Int, _ j: Int, _ board: [[Character]]) -> Bool {
62+
return i >= 0 && i < board.count && j >= 0 && j < board[0].count
63+
}
64+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy