📄문제
7*7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 통로이다. 격자판의 움직임은 상하좌우로만 움직인다.
미로가 다음과 같다면
위의 지도에서 출발점에서 도착점까지 갈 수 있는 방법의 수는 8가지이다.
⬇️ 입력
첫 번째 줄부터 7*7 격자의 정보가 주어집니다.
0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 |
⬆️ 출력
첫 번째 줄에 경로의 가지수를 출력한다.
8 |
📝 풀이
#include <iostream>
#define _MAZE_SIZE 7
static bool maze[_MAZE_SIZE][_MAZE_SIZE];
static bool isVisited[_MAZE_SIZE][_MAZE_SIZE];
static int cnt = 0;
void DFS(int w, int d) // width, depth
{
isVisited[w][d] = true;
if (w == 6 && d == 6)
{
++cnt;
}
else
{
// 네 방향을 검사
// 왼쪽 방향으로 갈 수 있는가?
if (w - 1 > 0 && maze[w - 1][d] == 0 && !isVisited[w - 1][d])
{
DFS(w - 1, d);
isVisited[w - 1][d] = false;
}
// 오른쪽 방향으로 갈 수 있는가?
if (w + 1 < _MAZE_SIZE && maze[w + 1][d] == 0 && !isVisited[w + 1][d])
{
DFS(w + 1, d);
isVisited[w + 1][d] = false;
}
// 위 방향으로 갈 수 있는가?
if (d - 1 > 0 && maze[w][d - 1] == 0 && !isVisited[w][d - 1])
{
DFS(w, d - 1);
isVisited[w][d - 1] = false;
}
// 아래 방향으로 갈 수 있는가?
if (d + 1 < _MAZE_SIZE && maze[w][d + 1] == 0 && !isVisited[w][d + 1])
{
DFS(w, d + 1);
isVisited[w][d + 1] = false;
}
}
}
int main()
{
int input;
for (int i = 0; i < _MAZE_SIZE; ++i)
for (int j = 0; j < _MAZE_SIZE; ++j)
{
isVisited[i][j] = false;
scanf_s("%d", &input);
maze[i][j] = input;
}
DFS(0, 0);
printf("%d", cnt);
}
- DFS를 이용하여 갈 수 있는 모든 방향에 대해 재귀로 DFS를 호출합니다.
- 목적지인 6, 6에 도착하였다면, CNT를 1 증가시킵니다.
'algorithms (C++)' 카테고리의 다른 글
[C++] 최소비용(DFS) (0) | 2023.10.18 |
---|---|
[C++] 경로 탐색(인접리스트, DFS) ⭐ (0) | 2023.10.18 |
[C++] 경로 탐색(인접행렬, DFS) 🔥 (0) | 2023.10.18 |
[C++] 인접행렬 가중치 그래프 (1) | 2023.10.17 |
[C++] 병합 정렬 (0) | 2023.10.17 |