문제
입출력
문제 요약
(0,0)으로 시작해서 (m,n)까지 갈 수 있는 경로를 구하는 문제이다.
단 이동할 수 있는 조건은 다음 좌표의 위치값이 현재 좌표의 위치값보다 작아야한다.
이 조건은 dfs 함수에서 (map[x][y] > map[nx][ny])로 구현하면 될 것 같다.
모든 경로의 수를 구해야 하니 살짝 dp 메모제이션 기법을 사용하면 좋을 것 같다.
[dp 배열]
3 | 2 | 2 | 2 | 1 |
1 | 1 | 1 | ||
1 | 1 | |||
1 | 1 | 1 | 1 | 목적지 |
문제에서 주어진 모든 경로들이 지나가는 곳에 1씩 더하면서 dfs를 시작하면
최종적으로 이런 dp 배열 형태가 만들어질 것이다.
코드
#include <iostream>
#include <cstring>
using namespace std;
int map[501][501];
int visited[501][501];
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int N, M;
int dfs(int x, int y) {
if (x == N - 1 && y == M - 1) {
return 1;
}
if (visited[x][y] == -1) {
visited[x][y] = 0;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < M){
if (map[x][y] > map[nx][ny]) {
visited[x][y] += dfs(nx, ny);
}
}
}
}
return visited[x][y];
}
int main() {
cin >> N >> M;
memset(visited, -1, sizeof(visited));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
cout << dfs(0, 0) << endl;
return 0;
}
'📖Algorithm > DFS & BFS' 카테고리의 다른 글
C++ [Algorithm] - 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2024.08.02 |
---|---|
C++ [Algorithm] - 백준 10026 적록색약 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 4963 섬의 개수 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 2667 단지번호붙이기 (0) | 2024.08.02 |
C++ [Algorithm] - 백준 1012 유기농 배추 (1) | 2024.07.29 |