문제 링크 : 백준 10164번
로봇은 오른쪽 또는 아래쪽으로만 갈 수 있으므로 dp를 이용해서 풀면 될 것 같았다.
먼저 격자판을 의미하는 dp배열은 int형 num과 bool형 check를 가지는 구조체로 선언해준다.(bool형은 동그라미 표시칸을 지나온건지 아닌지를 나타낸다.)
최종적으로 dp[n][m].num
을 출력해주면 된다.
package main
import (
"bufio"
"fmt"
"os"
)
type node struct {
num int
check bool
}
var n, m, k int
var dp [16][16]node
func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
fmt.Fscan(r, &n, &m, &k)
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
dp[i][j] = node{
num: 1,
check: false,
}
}
}
if k != 0 {
k--
x := k / m
y := k % m
for i := x + 1; i <= n; i++ {
for j := y + 1; j <= m; j++ {
dp[i][j].check = true
}
}
}
for i := 2; i <= n; i++ {
for j := 2; j <= m; j++ {
num1 := dp[i-1][j].num
num2 := dp[i][j-1].num
temp1 := dp[i-1][j].check
temp2 := dp[i][j-1].check
nextnum := num1 + num2
nextcheck := true
if temp1 == false && temp2 == false {
nextcheck = false
} else if temp1 && temp2 == false {
nextnum = num1
} else if temp1 == false && temp2 {
nextnum = num2
}
if dp[i][j].check {
nextcheck = true
}
dp[i][j] = node{
num: nextnum,
check: nextcheck,
}
}
}
fmt.Fprintln(w, dp[n][m].num)
}