본문 바로가기
알고리즘 이전/재귀, DFS, BFS, Tree, Graph

DFS 미로찾기

by hoshi03 2023. 8. 31.

7*7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요.

출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 통로이다.

격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면

입력 

0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 0 0 0 1
1 1 0 1 1 0 0
1 0 0 0 0 0 0

 

출력

8

 

DFS로 dx,dy배열을 순회하면서 갈수 있는 칸이면 가고 간 칸은 체크, 갔다가 돌아오면서 체크 해제 하는 방법으로 푼다

DFS 함수 내부에서는 갈수 있는 칸인지 판별하기 위해서 범위를 확인하고 넘어간다

import java.util.Scanner;

public class Main {
    static int ans = 0;
    static int[][] board;
    static int[] dx= {-1, 0, 1, 0};
    static  int[] dy = {0, 1, 0, -1};
    public void Solution(){

    }

    public void DFS(int x, int y){
        if (x == 7 && y == 7) ans++;

        else {
            for (int i =0; i < 4; i++){
                int nx = dx[i] + x;
                int ny = dy[i] + y;
                if(nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0){
                    board[nx][ny] = 1;
                    DFS(nx, ny);
                    board[nx][ny] = 0;
                }
            }
        }

    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Main T = new Main();

        board = new int[8][8];

        for (int i  = 1; i <= 7; i++) {
            for(int j = 1; j <= 7; j++) board[i][j] = in.nextInt();
        }

        board[1][1] = 1;
        T.DFS(1,1);
        System.out.println(ans);
    }
}

'알고리즘 이전 > 재귀, DFS, BFS, Tree, Graph' 카테고리의 다른 글

토마토(BFS 활용)  (0) 2023.09.01
미로의 최단거리(BFS)  (0) 2023.08.31
조합 구하기  (0) 2023.08.25
수열 추측하기  (0) 2023.08.25
순열 구하기  (0) 2023.08.24