큐로 BFS를 구현했다.
class Queue<T>{
var enq = [T]()
var deq = [T]()
init(_ queue:[T]){
self.enq = queue
}
var count: Int{
return enq.count + deq.count
}
func push(a:T){
enq.append(a)
}
func pop()-> T?{
if deq.isEmpty{
deq = enq.reversed()
enq.removeAll()
}
return deq.removeLast()
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = input[0]
let m = input[1]
var li = [[Int]]()
for _ in 0..<n{
li.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}
let ix = [0,0,1,-1]
let iy = [1,-1,0,0]
var q:Queue = Queue([])
for i in 0..<n{
for j in 0..<m{
if li[i][j] == 2{
q.push(a: [i,j])
}
}
}
let qsave = Queue([])
qsave.deq = q.deq
qsave.enq = q.enq
var clean = 0
var liSafe = li
func findClean()->Int{
while q.count != 0{
for _ in 0..<q.count{
guard let poison = q.pop() as? [Int] else { fatalError() }
for k in 0..<4{
let row = poison[0] + ix[k]
let col = poison[1] + iy[k]
if row < 0 || col < 0 || row >= n || col >= m{
continue
}
if li[row][col] == 0{
li[row][col] = 2
q.push(a: [row,col])
}
}
}
}
var ret = 0
for i in 0..<n{
for j in 0..<m{
if li[i][j] == 0{
ret = ret + 1
}
}
}
return ret
}
for i in 0..<n*m{
for j in i+1..<n*m{
for k in j+1..<n*m{
if li[i/m][i%m] >= 1 || li[j/m][j%m] >= 1 || li[k/m][k%m] >= 1{
continue
}
// print("\(i/m),\(i%m) \(j/m),\(j%m) \(k/m),\(k%m)")
li[i/m][i%m] = 1
li[j/m][j%m] = 1
li[k/m][k%m] = 1
let hubo = findClean()
if clean < hubo{
clean = hubo
}
li = liSafe
q.deq = qsave.deq
q.enq = qsave.enq
}
}
}
print(clean)