1012有機白菜
Today 1/15
有機白菜(My Code)
有機白菜
また,配列を直接変更するのではなくaccessを用いてチェックするという問題に対しては,そうする必要はないかもしれないので,次のDFS,BFSが出てきたら参考にして解決すべきである.
有機白菜(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が出てきたら参考にして解決すべきである.
Reference
この問題について(1012有機白菜), 我々は、より多くの情報をここで見つけました https://velog.io/@seosieve/1012-유기농-배추テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol