※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24392번 문제인 영재의 징검다리이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24392
24392번: 영재의 징검다리
첫 줄에 N과 M(1 ≤ N, M ≤ 1,000)이 공백으로 구분되어 주어지고, 그 뒤에는 N줄에 걸쳐 다리의 정보가 주어진다. 강화유리의 경우 1, 일반 유리의 경우 0으로 주어진다.
www.acmicpc.net
아래쪽 행에서 위쪽 행으로 이동하는 경우의 수는 위쪽 행에서 아래쪽 행으로 이동하는 경우의 수와 같으므로(방향만 서로 반대인 같은 모양의 경로가 일대일 대응되므로), 위쪽 행에서 아래쪽 행 방향으로 입력받는 순서대로 편하게 경우의 수를 구해나가도 된다.
첫 행의 0과 1 값을 초기값으로 하고, 그 외의 행의 경우 0이면 그 칸까지 도달하는 경우의 수는 0개, 1이라면 그 칸까지 도달하는 경우의 수는 그 칸의 좌상단칸, 상단칸, 우상단칸으로 부터 오는 가짓수의 합으로 계산하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
ll arr[1001][1002];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int R, C; cin >> R >> C;
for (int c = 1; c <= C; c++) cin >> arr[1][c];
for (int r = 2; r <= R; r++) {
for (int c = 1; c <= C; c++) {
int x; cin >> x;
if (x) {
arr[r][c] = (arr[r - 1][c] + arr[r - 1][c - 1] + arr[r - 1][c + 1]) % 1000000007;
}
}
}
ll ans = 0;
for (int c = 1; c <= C; c++) {
ans += arr[R][c];
}
cout << ans % 1000000007;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 24396 // C++] 푸앙이와 별 (0) | 2022.02.16 |
---|---|
[BOJ 24397 // C++] 말해 xor NO! (0) | 2022.02.15 |
[BOJ 24075 // C++] 計算 (Calculation) (0) | 2022.02.13 |
[BOJ 1448 // C++] 삼각형 만들기 (0) | 2022.02.12 |
[BOJ 24379 // C++] КИФЛИЧКИ (0) | 2022.02.11 |