반응형
문제
스택 미로 로직 생각 해보기
상 우 하 좌의 좌표를
0 1 2 3
dx -1 0 1 0
dy 0 1 0 -1
로 두고 direction의 좌표를 탐색하는 방식으로 스택에 쌓음.
만약 이동가능한 path 라면 visit로 바꾸고 visit라면 back으로 바꿈
if(4방향 반복)
if(범위이상 벗어나지 않거나 메이즈가 이동가능한 path 이면 실행)
이동 가능하다면 stack.push
이동 가능한 지 플래그 true
이동 불가능 플래그라면 maze[x][y]를 back 으로 변경 후 stack.pop
범위이상
정답 코드
#include <iostream>
#define MAZE_SIZE 10
#define STACK_MAX_SIZE 1000
using namespace std;
enum EMAZETYPE { PATH, WALL, VISIT, BACK }; // 0,1,2,3
int Maze[MAZE_SIZE][MAZE_SIZE] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 1, 0, 1, 1, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1, 0, 1},
{1, 0, 1, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 1, 1, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};
struct Position
{
int x, y;
};
struct Direction
{
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
};
struct MyStack
{
Position Array[STACK_MAX_SIZE];
int nTopIndex;
int stackSize = 0;
void init_stack()
{
nTopIndex = -1;
}
int is_empty()
{
return (nTopIndex == -1);
}
int is_full()
{
return (nTopIndex == STACK_MAX_SIZE - 1);
}
void Push(Position data)
{
if (is_full())
{
return;
}
//nTopIndex++;
stackSize++;
Array[++nTopIndex] = data;
}
Position Pop()
{
if (is_empty())
{
exit(1);
}
return Array[nTopIndex--];
}
Position Peek()
{
return Array[nTopIndex];
}
void MazeDraw()
{
for (size_t i = 0; i < MAZE_SIZE; i++)
{
for (size_t j = 0; j < MAZE_SIZE; j++)
{
switch (Maze[i][j])
{
case PATH:
cout << " ";
break;
case WALL:
cout << "#";
break;
case VISIT:
cout << "V";
break;
case BACK:
cout << "B";
break;
}
}
cout << endl;
}
}
};
int main()
{
MyStack stack;
Direction d;
stack.init_stack();
stack.Push({ 1, 1 });
while (!stack.is_empty())
{
// stack 상단 뽑기
int x = stack.Peek().x;
int y = stack.Peek().y;
if (x == MAZE_SIZE - 2 && y == MAZE_SIZE - 2)
{
Maze[x][y] = VISIT;
break;
}
if (Maze[x][y] == PATH) {
Maze[x][y] = VISIT;
}
else if (Maze[x][y] == VISIT) {
Maze[x][y] = BACK;
}
bool flag = false;
for (size_t i = 0; i < 4; i++)
{
// 4방향 좌표 반복으로 체크
int nx = x + d.dx[i];
int ny = y + d.dy[i];
// 범위 이상 벗어나지 않거나 메이즈가 이동가능한 0 이면 실행
if ((0 <= nx && nx < MAZE_SIZE) && (0 <= ny && ny < MAZE_SIZE) && Maze[nx][ny] == PATH)
{
// 이동 가능하다면 스택 추가
stack.Push({ nx,ny });
// 이동 가능한지 체크 플래그 설정
flag = true;
break;
}
}
// 플래그가 false 라면 B로 만들어줌
if (!flag)
{
Maze[x][y] = BACK;
// B로 만든 후에 pop으로 최상단 빼기
stack.Pop();
}
}
stack.MazeDraw();
return 0;
}
// 하... 겨우 했다.. 미로 갇히지 말자..
반응형
'Game 개발' 카테고리의 다른 글
단일 연결 리스트 미로 탈출 (0) | 2024.04.17 |
---|