DFS로 구현한 미로 찾기 알고리즘
1. DFS란?
Depth First Search 의 약자로, 한 길로 갈 수 있는 길의 끝까지 간 다음, 막다른 길이면 한걸음 후퇴하고 다음 길을 찾는 알고리즘 입니다.
2. DFS 알고리즘 개요
- 이 알고리즘은 Stack 자료구조를 사용합니다.
- 방위 중 우선 자신이 제일 먼저 갈 수 있는 길로 갑니다. 그리고 이전의 길을 스택에 Push 합니다.
- 그 길에서 2를 반복합니다.
- 막다른 길을 만났을 경우, 스택의 Top으로 돌아갑니다. Top 위치에는 다른 길로 갈 수 있을 수 있습니다.
- 또 2를 반복 합니다. 중요한 점은, 이미 갔던 길은 다시 갈 수 없다는 것입니다.
3. offset 및 Items의 개요
move[]는 N~NW까지 8개 방위의 값을 나타냅니다.
Items 구조체는 스택에 저장할 자료형 입니다. x, y 인덱스 정보와 방향을 담고 있습니다.
struct offset {
int a, b;
} move[8] = { -1,0 , -1,1, 0,1, 1,1 , 1,0 , 1,-1, 0,-1, -1,-1 };
struct Items {
Items(int xx = 0, int yy = 0, int dd = 0) : x(xx), y(yy), dir(dd) {}
int x, y, dir;
};
4. 미로를 탐색하는 SearchMaze 함수 소스코드
void SearchMaze(const int m, const int p) {
mark[1][1] = 1;
stack stack;
Items temp(1, 1, E);
stack.push(temp);
// 방문한 노드의 개수를담을 변수 선언.
int visitedCount = 0;
// 스택이 비어있지 않을 동안 루프 돌림.
while (!stack.empty()) {
// 현재 스택의 Top을 기준으로 미로 탐색 실시.
temp = stack.top();
stack.pop();
int i = temp.x;
int j = temp.y;
int d = temp.dir;
// temp의 d의 정보에 따라 while 루프를 돌리는 횟수가 달라짐.
while (d < 8) {
// d(방향)에 따른 좌표 변화를 담을 변수 g, h 선언.
int g = i + ::move[d].a;
int h = j + ::move[d].b;
// 탐색한 방향이 출구라면, 출력.
if ((g == m) && (h == p)) {
// 출력 코드.
return;
}
// 다음 인덱스의 미로를 갈 수 있고, 한번도 가본적이 없는 곳이라면,
if ((!::maze[g][h]) && (!::mark[g][h])) {
// 마킹 실시 후 i,j,d 의 정보를 다음 인덱스로 초기화 시킴으로써 DFS 실시.
mark[g][h] = 1;
temp.x = i;
temp.y = j;
temp.dir = d + 1;
stack.push(temp);
i = g;
j = h;
d = N; // d를 N(=0)으로초기화 시킴으로서 다음 인덱스에서 8방향 전부 탐색을 가능하게 함 .
}
// 다음 인덱스로 갈 수 없다면, 다음방향을 탐색한다.
else d++;
}
}
// 스택이 비어서 다음방향으로 이동할 수 없을 경우, 미로엔 길이 없음을 출력.
cout << "미로를 탈출할 수 없습니다." << endl;
}
댓글
댓글 쓰기