읽기 전
- 해당 게시물은 작성자가 학습한 내용을 정리 및 요약 목적으로 작성되었으므로 오역 및 오개념이 있을 수 있습니다.
- 바로잡기 위한 의견을 제시해주시면 매우 감사하겠습니다.
Rat in Maze

왼쪽 위가 시작점은 N*N 이진 행렬이 주어졌다고 하자. 도착 지점은 오른쪽 아래이며 좌표로 표현하면 시작점: maze[0][0]
, 도착점: maze[N-1][N-1]
이 된다. 쥐는 시작점에서 출발하여 도착점까지 가야 하는데 오직 아래 방향과 우측 방향으로만 이동할 수 있다. 주어진 이진 행렬에서 0은 막혀있는 블록, 1은 경로로 사용할 수 있는 블록을 의미한다. 그렇다면 쥐가 maze의 시작점에서 도착점까지 갈 수 있는 경로를 출력하자.
Backtracking
- 0으로 채워진 경로 행렬을 생성한다.
- 쥐의 좌표와 전체 지도, 경로를 기록할 행렬을 받는 재귀함수를 생성한다.
- 만약 좌표가 맵을 벗어나거나 유효하지 않은 좌표라면 넘어간다.
- 가능한 좌표일 경우 해당 좌표에 1을 체크하고 현재 좌표가 도착지점인지 검사한다. 만약 도착지점이라면 경로를 출력한다.
- (i+1, j), (i, j+1) 좌표에 대해 계속 재귀 탐색을 진행한다.
- 만약 이후 단계에 문제가 생기면 (i, j) 좌표를 다시 0으로 초기화한다.
C코드
| #include <stdio.h> |
| #define N 4 |
| |
| bool solveMazeUtil(int x, int y, int sol[N][N], int maze[N][N]); |
| |
| |
| void printSolution(int sol[N][N]) |
| { |
| for (int x = 0; x < N; x++) |
| { |
| for (int y = 0; y < N; y++) |
| { |
| printf("%d ", sol[x][y]); |
| } |
| printf("\n"); |
| } |
| } |
| |
| |
| int isSafe(int x, int y, int maze[N][N]) |
| { |
| |
| return (0 <= x && x < N && 0 <= y && y < N && maze[x][y] == 1); |
| } |
| |
| |
| bool solveMaze(int maze[N][N]) |
| { |
| int sol[N][N]; |
| |
| for (int x = 0; x < N; x++) |
| { |
| for (int y = 0; y < N; y++) |
| { |
| sol[x][y] = 0; |
| } |
| } |
| |
| |
| if (solveMazeUtil(0, 0, sol, maze) == true) |
| { |
| printSolution(sol); |
| return true; |
| } |
| else |
| { |
| printf("There's no Solution!"); |
| return false; |
| } |
| } |
| |
| |
| bool solveMazeUtil(int x, int y, int sol[N][N], int maze[N][N]) |
| { |
| if (x == N-1 && y == N-1 && maze[x][y] == 1) |
| { |
| sol[x][y] = 1; |
| return true; |
| } |
| |
| if (isSafe(x, y, maze)) |
| { |
| sol[x][y] = 1; |
| if (solveMazeUtil(x+1, y, sol, maze)) |
| { |
| return true; |
| } |
| else if (solveMazeUtil(x, y+1, sol, maze)) |
| { |
| return true; |
| } |
| else |
| { |
| sol[x][y] = 0; |
| return false; |
| } |
| } |
| return false; |
| } |
| |
| int main() |
| { |
| int maze[N][N] = { { 1, 0, 0, 0 }, |
| { 1, 1, 0, 1 }, |
| { 0, 1, 0, 0 }, |
| { 1, 1, 1, 1 } }; |
| |
| solveMaze(maze); |
| return 0; |
| } |
Python 코드
| def printSolution(sol): |
| for i in sol: |
| for j in i: |
| print(str(j) + " ", end = "") |
| print("") |
| |
| def isSafe(x, y, maze): |
| return (0 <= x < N and 0 <= y < N and maze[x][y] == 1) |
| |
| def solveMaze(maze): |
| sol = [[0 for j in range(4)] for i in range(4)] |
| |
| if solveMazeUtil(0, 0, sol, maze) == False: |
| print("There's no Solution!") |
| return False |
| else: |
| printSolution(sol) |
| return True |
| |
| def solveMazeUtil(x, y, sol, maze): |
| if x == N-1 and y == N-1 and maze[x][y] == 1: |
| sol[x][y] = 1 |
| return True |
| |
| if isSafe(x, y, maze): |
| sol[x][y] = 1 |
| if solveMazeUtil(x+1, y, sol, maze): |
| return True |
| elif solveMazeUtil(x, y+1, sol, maze): |
| return True |
| else: |
| sol[x][y] = 0 |
| return False |
| |
| maze = [ [1, 0, 0, 0], |
| [1, 1, 0, 1], |
| [0, 1, 1, 0], |
| [1, 1, 1, 1] ] |
| N = 4 |
| solveMaze(maze) |
C++ 코드
c++ 코드는 C 코드와 문법을 비교했을 때 출력문을 제외하고는 없어서 주석을 생략하였다.
| #include <bits/stdc++.h> |
| using namespace std; |
| #define N 4 |
| |
| bool solveMazeUtil(int x, int y, int sol[N][N], int maze[N][N]); |
| |
| void printSolution(int sol[N][N]) |
| { |
| for (int x = 0; x < N; x++) |
| { |
| for (int y = 0; y < N; y++) |
| { |
| cout << sol[x][y] << " "; |
| } |
| cout << endl; |
| } |
| } |
| |
| int isSafe(int x, int y, int maze[N][N]) |
| { |
| return (0 <= x < N && 0 <= y < N && maze[x][y] == 1); |
| } |
| |
| bool solveMaze(int maze[N][N]) |
| { |
| int sol[N][N]; |
| |
| for (int x = 0; x < N; x++) |
| { |
| for (int y = 0; y < N; y++) |
| { |
| sol[x][y] = 0; |
| } |
| } |
| |
| if (solveMazeUtil(0, 0, sol, maze)) |
| { |
| printSolution(sol); |
| return true; |
| } |
| else |
| { |
| cout << "There's no Solution" << endl; |
| return false; |
| } |
| } |
| |
| bool solveMazeUtil(int x, int y, int sol[N][N], int maze[N][N]) |
| { |
| if (x == N-1 && y == N-1 && maze[x][y] == 1) |
| { |
| sol[x][y] = 1; |
| return true; |
| } |
| |
| if (isSafe(x, y, maze)) |
| { |
| sol[x][y] = 1; |
| if (solveMazeUtil(x+1, y, sol, maze)) |
| { |
| return true; |
| } |
| else if (solveMazeUtil(x, y+1, sol, maze)) |
| { |
| return true; |
| } |
| else |
| { |
| sol[x][y] = 0; |
| return false; |
| } |
| } |
| return false; |
| } |
| |
| int main() |
| { |
| int maze[N][N] = { { 1, 0, 0, 0 }, |
| { 1, 1, 0, 1 }, |
| { 0, 1, 0, 0 }, |
| { 1, 1, 1, 1 } }; |
| |
| solveMaze(maze); |
| return 0; |
| } |
참고자료
- Rat in a Maze | Backtracking-2