문제 링크 : 백준 15684번
가로선을 놓을 수 있는 모든 경우의 수를 해봐야한다.(나는 조합을 사용했다.)
package main
import (
"bufio"
"fmt"
"os"
)
var (
r = bufio.NewReader(os.Stdin)
w = bufio.NewWriter(os.Stdout)
n, m, h int
arr [11][300]int
ans = -1
)
func check(max int, cnt int, startx int, starty int) {
if max < cnt {
return
}
for i := starty; i <= h; i++ {
if i > starty {
startx = 1
}
for j := startx; j <= n-1; j++ {
if arr[j][i] == 0 && arr[j+1][i] != 1 {
arr[j][i] = 1
arr[j+1][i] = 2
if search() { // 테스트
if ans == -1 || ans > cnt {
ans = cnt
}
}
check(max, cnt+1, j, i)
arr[j][i] = 0
arr[j+1][i] = 0
}
}
}
}
func search() bool {
for i := 1; i <= n; i++ {
start := i
for j := 1; j <= h; j++ {
if arr[start][j] == 1 {
start++
} else if arr[start][j] == 2 {
start--
}
}
if start != i {
return false
}
}
return true
}
func main() {
defer w.Flush()
fmt.Fscan(r, &n, &m, &h)
for i := 0; i < m; i++ {
var a, b int
fmt.Fscan(r, &a, &b)
arr[b][a] = 1 // 오른쪽
arr[b+1][a] = 2 // 왼쪽
}
if search() { // 아무것도 안해도 정답일 때
fmt.Fprintln(w, 0)
} else {
check(3, 1, 1, 1)
fmt.Fprintln(w, ans)
}
}