func wallsAndGates(_ rooms: inout [[Int]]) {
if rooms.isEmpty || rooms.first!.isEmpty {
return
}
let INF = 2147483647
let m = rooms.count, n = rooms.first!.count
// 光环找门,直到找到门或者没有元素为止
func findValue(_ rooms: [[Int]], _ i: Int, _ j: Int, _ step: inout Int) {
var set: [String] = []
var quene: [String] = []
quene.append("\(i)+\(j)")
while !quene.isEmpty {
step += 1
// 广度优先搜索的核心层循环
for _ in 0..<quene.count {
let str = quene.removeFirst()
let x: Int = Int(String(str.split(separator: "+").first!))!
let y: Int = Int(String(str.split(separator: "+").last!))!
set.append("\(x)+\(y)")
let value = rooms[x][y]
// 遇到墙,当前循环截止
if value == -1 {
continue
}
// 遇到门,结束
else if value == 0 {
return
}
if !set.contains("\(x)+\(y+1)") && y+1 < n {
quene.append("\(x)+\(y+1)")
}
if !set.contains("\(x+1)+\(y)") && x+1 < m {
quene.append("\(x+1)+\(y)")
}
if !set.contains("\(x)+\(y-1)") && y-1 >= 0 {
quene.append("\(x)+\(y-1)")
}
if !set.contains("\(x-1)+\(y)") && x-1 >= 0 {
quene.append("\(x-1)+\(y)")
}
}
}
step = INF
}
// 对每个非墙与门的元素做光环找门
for i in 0..<m {
for j in 0..<n {
let value = rooms[i][j]
if value == INF {
var step = -1
findValue(rooms, i, j, &step)
rooms[i][j] = step
}
}
}
}
var rooms = [[2147483647, -1, 0, 2147483647],[2147483647, 2147483647, 2147483647, -1],[2147483647, -1, 2147483647, -1],[0, -1, 2147483647, 2147483647]]
wallsAndGates(&rooms)
for value1 in rooms {
var value = ""
for value2 in value1 {
value += "\(value2) "
}
print(value)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。