스택 응용 - 미로 찾기
스택을 활용하여 미로찾기
움직일 수 있는 공간 0
장애물 숫자1
방문지점 숫자2
골인지점 숫자3
1. 출발지점 에서부터 다음 방향으로 이동 가능여부를 판단한다.
2. 다음 방향은 ↑ → ↓ ← 순으로 확인을 한다.
3. 움직일 수 있는 공간이면 현재 지점을 방문으로 지정하고 스택에 Push후 다음 지점으로 이동한다.
4. 이미 방문한 지점이고 이동할 수 없으면 스택에서 Pop을 한 후 이전지점의 으로 이동하고 방향을 확인한다.
5. 골인 지점에 도착하면 종료한다.
필요한 전역 함수
const int Width = 10;
const int Height = 10;
int Map[Height][Width] =
{
0,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,1,1,
1,1,1,0,1,1,1,1,1,1,
1,1,1,0,1,1,1,1,0,1,
1,1,1,0,1,1,1,1,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,1,1,1,1,1,1,1,1,
0,0,1,1,1,0,0,0,0,1,
0,1,1,1,1,0,1,1,0,1,
0,0,0,0,0,0,1,1,0,3
};
int DirectionOffset[4][2] =
{
{0, -1},
{1, 0},
{0, 1},
{-1, 0}
};
스택 미로찾기 함수
MyStack* PathFinder()
{
MyStack* Stack = new MyStack();
Position Pos;
Pos.X = 0;
Pos.Y = 0;
Pos.Dir = 0;
int Dir = Pos.Dir;
Stack->Push(Pos);
while (1)
{
Pos = Stack->Top();
Dir = Pos.Dir;
while (Dir < 4)
{
int NewX = Pos.X + DirectionOffset[Dir][0];
int NewY = Pos.Y + DirectionOffset[Dir][1];
if (NewX >= 0 && NewX < Width &&
NewY >= 0 && NewY < Height &&
Map[NewY][NewX] != 1 && Map[NewY][NewX] != 2)
{
Map[Pos.Y][Pos.X] = 2;
Pos.X = NewX;
Pos.Y = NewY;
Pos.Dir = Dir + 1;
Stack->Push(Pos);
Dir = 0;
if (Pos.X == 9 && Pos.Y == 9)
{
return Stack;
}
}
else
{
Dir++;
}
}
Stack->Pop();
}
return nullptr;
}
메인 함수
int main()
{
MyStack* Stack = PathFinder();
Stack->Show();
}
'자료구조' 카테고리의 다른 글
[자료구조] 이진 트리(Binary Tree) (0) | 2023.08.07 |
---|---|
[자료구조] 원형 큐(Circular Queue) - 배열을 이용한 구현 (0) | 2023.07.31 |
[자료구조] 스택 응용 - 사칙연산 계산기 (2) (0) | 2023.07.26 |
[자료구조] 스택 응용 - 사칙연산 계산기 (1) (0) | 2023.07.23 |
[자료구조] 스택(Stack) - 링크드 리스트를 이용한 구현 (0) | 2023.07.21 |