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)
}

Ethan周周
15 声望1 粉丝

此人有BUG!