1012有機白菜


Today 1/15
有機白菜(My Code)
func movingCabbage(_ field: inout [[Int]], _ x: Int, _ y: Int, _ maxX: Int, _ maxY: Int) {
    field[x][y] = 0
    if x-1 >= 0 {
        if field[x-1][y] == 1 {
            movingCabbage(&field, x-1, y, maxX, maxY)
        }
    }
    if y-1 >= 0 {
        if field[x][y-1] == 1 {
            movingCabbage(&field, x, y-1, maxX, maxY)
        }
    }
    if x+1 <= maxX-1 {
        if field[x+1][y] == 1 {
            movingCabbage(&field, x+1, y, maxX, maxY)
        }
    }
    if y+1 <= maxY-1 {
        if field[x][y+1] == 1 {
            movingCabbage(&field, x, y+1, maxX, maxY)
        }
    }
}

for _ in 0..<Int(readLine()!)! {
    let MNK = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (M,N,K) = (MNK[0], MNK[1], MNK[2])
    var field = Array(repeating: Array(repeating: 0, count: M), count: N)
    var earthwormCount = 0
    for _ in 0..<K {
        let input = readLine()!.split(separator: " ").map{Int(String($0))!}
        field[input[1]][input[0]] = 1
    }
    
    for row in 0..<N {
        for col in 0..<M {
            if field[row][col] == 1 {
                earthwormCount += 1
                movingCabbage(&field, row, col, N, M)
            }
        }
    }
    print(earthwormCount)
}
隣接する白菜を探索するDFS,BFS問題である.どんな方法でやっても大丈夫で、DFS再帰は一度も使ったことがないようなので、再帰で解決することにしました.
有機白菜
let T = Int(String(readLine()!))!
let dx: [Int] = [1, 0, -1, 0]
let dy: [Int] = [0, 1, 0, -1]

for _ in 0..<T {
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    let (M, N, K) = (input[0], input[1], input[2])
    var arr = Array(repeating: Array(repeating: 0, count: M+2), count: N+2)
    for _ in 0..<K {
        let XY = readLine()!.split(separator: " ").map { Int(String($0))! }
        arr[XY[1]][XY[0]] = 1
    }
    
    var answer = 0
    var visited = Array(repeating: Array(repeating: false, count: M+2), count: N+2)
    
    for i in 0..<N {
        for j in 0..<M {
            if arr[i][j] == 0 || visited[i][j] { continue }
            answer += 1
            visited[i][j] = true
            
            var queue: [[Int]] = []
            queue.append([i, j])
            
            while !queue.isEmpty {
                let cur: [Int] = queue.removeFirst()
                for i in 0..<4 {
                    let nx = cur[0] + dx[i]
                    let ny = cur[1] + dy[i]
                    if nx < 0 || nx >= N || ny < 0 || ny >= M { continue }
                    if visited[nx][ny] || arr[nx][ny] != 1 { continue }
                    visited[nx][ny] = true
                    queue.append([nx, ny])
                }
            }
            
        }
    }
    
    print(answer)
}
他の回答から,配列としてdx,dyの上下左右に数字を設定し,重複文を迂回して範囲を超えるとcontinueで多く解けた.
また,配列を直接変更するのではなくaccessを用いてチェックするという問題に対しては,そうする必要はないかもしれないので,次のDFS,BFSが出てきたら参考にして解決すべきである.