CodingTest Exam/[C++] Algorithm Study
65. 미로탐색(DFS) (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★★★☆☆
HongongHB
2023. 8. 19. 20:31
#include <stdio.h>
using namespace std;
int map[8][8];
int count = 0;
void FindRoute(int x, int y)
{
if(x == 7 && y == 7)
{
count++;
}
else
{
if(map[x][y+1] == 0)
{
if(y+1 < 8)
{
map[x][y] = 1;
FindRoute(x, y+1);
map[x][y] = 0;
}
}
if(map[x][y-1] == 0)
{
if(y-1 > 1)
{
map[x][y] = 1;
FindRoute(x, y-1);
map[x][y] = 0;
}
}
if(map[x+1][y] == 0)
{
if(x+1 < 8)
{
map[x][y] = 1;
FindRoute(x+1, y);
map[x][y] = 0;
}
}
if(map[x-1][y] == 0)
{
if(x-1 > 1)
{
map[x][y] = 1;
FindRoute(x-1, y);
map[x][y] = 0;
}
}
}
}
int main()
{
for(int i = 1; i <= 7; i++)
{
for(int j = 1; j <= 7; j++)
scanf("%d", &map[i][j]);
}
FindRoute(1, 1);
printf("%d", count);
return 0;
}
1. 7 * 7 배열 map, 도착지점에 도달할 수 있는 경우의 수 count 를 선언한다.
2. 현재 위치 (x, y) 에서 상하좌우를 확인하여 0이라면 이동한다. 이동한 후에는 이전의 위치를 1로 바꾸어 다시 돌아가는 경우가 없도록 방지한다.
// 오른쪽으로 이동할 때
if(map[x][y+1] == 0)
{
if(y+1 < 8) // 7 * 7 배열이기 때문에 크기를 벗어나지 않아야함
{
map[x][y] = 1; // 지금의 위치를 1로 만들고
FindRoute(x, y+1); // 오른쪽으로 이동
map[x][y] = 0; // 모든 이동이 끝나면 0으로 초기화
}
}
3. 재귀함수가 모두 끝나고 나면 다시 map[x][y] 를 0으로 만들어주어야 다른 재귀함수에서 다시 길로 인식할 수 있다.
(call by Reference 방식이기 때문)