DFS를 통하여 길을 탐색한다.
오른쪽, 아래쪽, 왼쪽, 위쪽 순으로 벽(1 - WALL)이 아니고 방문한곳(4 - VISIT)이 아닌 경우에만 탐색을 진행한다.
도착지점(3 - GOAL)을 발견하면 SUCCESS = 1을 대입하여 도착했음을 확인한다.
아래는 전체 소스코드이다.
#include <stdio.h>
#define MAZE_LENGTH 16
#define GOAL 3
#define TESTCASE 10
#define WALL 1
#define VISIT 4
void InitializeMaze();
void PrintMaze();
void CreateMaze();
void DFSExploreMaze(int x, int y);
int T = 0;
int Maze[MAZE_LENGTH][MAZE_LENGTH] = { 1, };
int Success = 0;
int main()
{
for (int i = 1; i <= TESTCASE; i++)
{
scanf(" %d", &T);
InitializeMaze();
CreateMaze();
DFSExploreMaze(1, 1);
printf("#%d %d\n", i, Success);
}
return 0;
}
//미로 배열 값을 0으로 초기화
void InitializeMaze()
{
for (int i = 0; i < MAZE_LENGTH; i++)
{
for (int j = 0; j < MAZE_LENGTH; j++)
{
Maze[i][j] = 0;
}
}
Success = 0;
}
//미로 배열 생성
void CreateMaze()
{
for (int i = 0; i < MAZE_LENGTH; i++)
{
for (int j = 0; j < MAZE_LENGTH; j++)
{
//INPUT 정수가 공백으로 나누어져있지 않아서 %c로 한글자씩 받아서 int로 변환
int temp = 0;
scanf(" %c", &temp);
Maze[i][j] = temp - 48;
//scanf(" %d", &Maze[i][j]); //이렇게 받으면 에러터짐.
}
}
}
//미로 보기
void PrintMaze()
{
for (int i = 0; i < MAZE_LENGTH; i++)
{
for (int j = 0; j < MAZE_LENGTH; j++)
{
printf("%d", Maze[i][j]);
}
printf("\n");
}
}
void DFSExploreMaze(int x, int y)
{
/*경로 확인시 주석 풀기*/
//printf("\n");
//PrintMaze();
//출구를 찾았을 때
if (Maze[x][y] == GOAL)
{
Success = 1;
}
//해당 지점을 방문했음을 표시
Maze[x][y] = VISIT;
//미로를 탐색한다. (우, 하, 좌, 상 순으로)
//오른쪽
if (Maze[x][y + 1] != WALL && Maze[x][y + 1] != VISIT)
{
DFSExploreMaze(x, y + 1);
}
//아래쪽
if (Maze[x + 1][y] != WALL && Maze[x+1][y] != VISIT)
{
DFSExploreMaze(x+1, y );
}
//왼쪽
if (Maze[x][y - 1] != WALL && Maze[x][y-1] != VISIT)
{
DFSExploreMaze(x, y - 1);
}
//위쪽
if (Maze[x-1][y] != WALL && Maze[x-1][y] != VISIT)
{
DFSExploreMaze(x-1, y);
}
/*
더이상 탐색할 공간이 없다면 뒤로 돌아간다.
굳이 없어도 되는 부분.
*/
return ;
}
미로 2의 경우
#define MAZE_LENGTH 100 으로 수정하면 동작한다.
'이것저것' 카테고리의 다른 글
SW 3809 화섭이의 정수 나열 [D3] (0) | 2018.03.25 |
---|---|
모의 SW 등산로 조성 소스 (0) | 2018.03.24 |
동적계획법 (0) | 2018.03.22 |
그래프, DFS, BFS (0) | 2018.03.18 |
탐색 알고리즘 (0) | 2018.03.14 |
댓글