문제 링크 : 백준 17144번
전형적인 구현 문제이다.
공기청정기 위쪽과 아래쪽 좌표를 저장해놓고 BFS탐색을 시작한다.
temp 배열에다 확산된 미세먼지들을 구하고 공기청정기 위쪽과 아래쪽 좌표를 통해 반시계방향과 시계방향으로 돌려준다.
돌려준 뒤에 arr배열에 완료된 temp배열을 대입해주고 공기청정기 좌표를 -1로 설정해준다.(temp 배열의 공기청정기 좌표값은 0으로 설정되어 있음)
package main
import (
"bufio"
"fmt"
"os"
)
type pair struct {
x, y int
}
var (
read = bufio.NewReader(os.Stdin)
write = bufio.NewWriter(os.Stdout)
r, c, t, uax, uay, dax, day int
arr [51][51]int
dx = [4]int{0, 0, -1, 1}
dy = [4]int{1, -1, 0, 0}
unclock = [5][2]int{{0, 1}, {-1, 0}, {0, -1}, {1, 0}}
clock = [5][2]int{{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
)
func BFS() {
var temp [51][51]int
// 확산
for i := 0; i < r; i++ {
for j := 0; j < c; j++ {
if arr[i][j] != 0 && arr[i][j] != -1 {
x := i
y := j
num := arr[x][y] / 5
cnt := 0
for k := 0; k < 4; k++ {
nx := x + dx[k]
ny := y + dy[k]
if nx < 0 || ny < 0 || nx >= r || ny >= c || arr[nx][ny] == -1 {
continue
}
temp[nx][ny] += num
cnt++
}
temp[x][y] += arr[x][y] - (num * cnt)
}
}
}
// 공기청정기 작동
// 위쪽
x := uax
y := uay
tmp := 0
for i := 0; i < 4; i++ {
for {
nx := x + unclock[i][0]
ny := y + unclock[i][1]
if nx < 0 || ny < 0 || nx > uax || ny >= c {
break
}
if arr[nx][ny] == -1 {
break
}
swap := temp[nx][ny]
temp[nx][ny] = tmp
tmp = swap
x = nx
y = ny
}
}
// 아래쪽
x = dax
y = day
tmp = 0
for i := 0; i < 4; i++ {
for {
nx := x + clock[i][0]
ny := y + clock[i][1]
if nx < dax || ny < 0 || nx >= r || ny >= c {
break
}
if arr[nx][ny] == -1 {
break
}
swap := temp[nx][ny]
temp[nx][ny] = tmp
tmp = swap
x = nx
y = ny
}
}
arr = temp
arr[uax][uay] = -1
arr[dax][day] = -1
}
func main() {
defer write.Flush()
fmt.Fscan(read, &r, &c, &t)
check := true
for i := 0; i < r; i++ {
for j := 0; j < c; j++ {
fmt.Fscan(read, &arr[i][j])
if arr[i][j] == -1 && check == false {
dax = i
day = j
}
if arr[i][j] == -1 && check {
uax = i
uay = j
check = false
}
}
}
for t > 0 {
t--
BFS()
}
sum := 0
for i := 0; i < r; i++ {
for j := 0; j < c; j++ {
sum += arr[i][j]
}
}
fmt.Fprintln(write, sum+2)
}