요즘 인프런에서 알고리즘 강좌를 듣고있는데,
내가 진짜 약했던 재귀 부분을 배우고 있다.
다음은 재귀를 사용한 미로찾기 코드이다.
재귀함수를 만들때는...
항상 베이스케이스를 생각하고, 베이스 케이스가 아닌 부분에서 베이스케이스로 수렴할 수 있도록 구현하는게 중요한 것 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import java.awt.*; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static class Maze { public Maze() { System.out.println("starting maze..."); printMaze(); findMazePath(0, 0); printMaze(); } private int N = 8; private int[][] maze = { {0, 0, 0, 0, 0, 0, 0, 1}, {0, 1, 1, 0, 1, 1, 0, 1}, {0, 1, 1, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 1}, {1, 1, 0, 0, 1, 1, 1, 0}, {0, 1, 0, 0, 0, 1, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 1, 0, 0} }; private static final int PATHWAY = 0; private static final int WALL = 1; private static final int BLOCKED = 2; private static final int PATH = 3; private boolean[][] visit = new boolean[N][N]; private boolean isExit(int x, int y) { return x == N-1 && y == N-1; } private boolean findMazePath(int x, int y) { // bc1: 갈 수 없는 곳일 때 if (x < 0 || x >= N || y < 0 || y >= N) { return false; } if (maze[x][y] != PATHWAY) { return false; } // bc2: 현재 위치가 출구일때 else if (isExit(x, y)) { System.out.println("visit: " + x + "," + y + "/" + maze[0].length + maze.length); maze[x][y] = PATH; return true; } else { visit[x][y] = true; // 만약 여기와 인접한 곳에 출구가 있고 여기도 길이라면 if (findMazePath(x-1, y) || findMazePath(x, y-1) || findMazePath(x+1, y)|| findMazePath(x, y+1)) { maze[x][y] = PATH; return true; } else { maze[x][y] = BLOCKED; return false; } } } private void printMaze() { for (int i = 0; i < maze.length; i++) { for (int j = 0; j < maze[0].length; j++) { System.out.print(maze[i][j] + " "); } System.out.println(); } } } public static void main(String[] args) { Maze m = new Maze(); } } | cs |
'프로그래밍 > Algorithm' 카테고리의 다른 글
알고리즘 실전 활용을 위한 요약 (1) | 2018.05.29 |
---|---|
[C++] 이진 탐색 트리 구현하기 (Binary Search Tree) (0) | 2017.05.22 |
[C++] 이진 트리 구현하고 순회하기 (Binary Tree in C++) (2) | 2017.05.21 |
자료구조 : 큐(Queue) 이해하고, 구현하기 in C++ (4) | 2016.12.24 |
자료구조 : 스택(Stack) 이해하고, 구현하기! C++ (0) | 2016.12.20 |