※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 12181번 문제인 Googlander (Large)이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/12181

 

이미 방문한 칸 및 격자 바깥의 칸은 방문할 수 없고, 회전 방향이 고정되어있음을 잘 이용해 문제를 해결해 보자.

 

C의 값이 1이라면 Googlander은 첫 행 끝까지 걸어 올라가고 행동을 멈추는 움직임만을 할 수 있으므로 움직임의 경우의 수는 단 하나임을 알 수 있다.

 

C의 값이 1이 아니라면, Googlander은 첫 행부터 마지막 행까지 중 하나의 행까지 올라간 다음 90도 회전해 앞으로 전진할 수 있다. 이 때 k번째 행까지 Googlander가 올라갔다면 90도 회전해 한 칸 전진한 이후의 움직임은 C1R(k1)열로 구성된 격자에서의 Googlander의 움직임의 경우의 수와 같은 가짓수의 움직임이 가능함을 알 수 있다. 

 

위 두 관찰을 이용해 점화식을 구성하여 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

int R, C;
ll dp[26][26];
ll func(ll r, ll c) {
	ll &ret = dp[r][c];
	if (ret) return ret;
	if (c == 1) return ret = 1;
	for (int rr = 1; rr <= r; rr++) {
		ret += func(c - 1, rr);
	}
	return ret;
}

void solve() {
	cin >> R >> C;
	cout << func(R, C) << '\n';
}

int T;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	for (int t = 1; t <= T; t++) {
		cout << "Case #" << t << ": ";
		solve();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 30630 // C++] 직각삼각형의 동생은?  (0) 2024.08.07
[BOJ 7873 // C++] Decision  (0) 2024.08.06
[BOJ 2128 // C++] 마지막 조별 시합  (0) 2024.08.04
[BOJ 20914 // C++] QWERTY 자판  (0) 2024.08.03
[BOJ 22288 // C++] Rainbow Road Race  (0) 2024.08.02

+ Recent posts