Coding Test

백준 준규와 사과(5913)

댕발바닥 2024. 3. 31. 22:08

 

오늘은 백트래킹 문제를 풀었다.

 

https://www.acmicpc.net/problem/5913

 

5913번: 준규와 사과

대학교를 졸업한 준규는 농부의 꿈을 이루기 위해서 가로 5m, 세로 5m 크기의 땅을 구입했다. 준규는 땅을 가로 1m, 세로 1m 크기로 구역을 나누었다. 가장 왼쪽 위 칸은 (1,1)이고 가장 오른쪽 아래

www.acmicpc.net

 

장애물을 제외하고 모든 경우를 진행해야하는 케이스이다 문제 조건중에서는 두 명의 포인트가 동등하게 움직여서 모든 경우를 채워야하는 조건이 붙어있다.

 

  • 장애물을 제외하고 모든 경우를 지나가야한다
  • 두 포인트가 동등하게 움직여 모이는 포인트를잡아야한다

 

필자의 풀이는 k는 짝수로 각 포인트가 움직여야하는 거리를 계산

 

0,0 포인트에서 해당 거리를 움직인 이후 해당 포인트에서 4,4로 진행이 가능한지 여부 체크하여 해를 구했다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static int answer = 0;
    static int distance = 0;
    static int[][] dir = { {0,1}, {0,-1}, {1,0}, {-1,0} };
    static boolean[][] block = new boolean[5][5];

    public static void main(String[] args) throws IOException {
        solution();
    }

    public static void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());

        for (int i=0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int n1 = Integer.parseInt(st.nextToken());
            int n2 = Integer.parseInt(st.nextToken());
            block[n1-1][n2-1] = true;
        }

        distance = (25 - N) / 2;
        dfs(0, 0, new boolean[5][5], 0, false);
        System.out.println(answer);
    }

    public static void dfs(int x, int y, boolean[][] visited, int loc, boolean flag) {
        if (loc == distance) {
            if (!flag) {
                dfs(x, y, visited,0, true);
            } else if (x == 4 && y == 4) {
                answer++;
            }
            return;
        }

        visited[x][y] = true;
        for (int i=0; i < dir.length; i++) {
            int x1 = x + dir[i][0];
            int y1 = y + dir[i][1];
            if (isTrue(x1, y1, visited)) {
                dfs(x1, y1, visited, loc + 1, flag);
            }
        }
        visited[x][y] = false;

    }

    public static boolean isTrue(int x, int y, boolean[][] visited) {
        if (x >=0 && y >=0 && x < 5 && y < 5 && !visited[x][y] && !block[x][y]) {
            return true;
        }
        return false;
    }


}

 

결과