알고리즘

[TOPCODER 알고리즘 트레이닝] 07. 고장난 로봇

greenkang 2022. 8. 29. 22:35

[풀이 방법]

보드의 중앙에서 탐색 시작

 

재귀 함수 종료 조건

   가능한 이동 횟수를 모두 사용했을 때, 여기까지 온 확률을 전체 성공 확률에 더해주고 탐색 종료

   

탐색 로직

    2-1) 동서남북 중 이미 방문했거나 이동 확률이 0이면 방문하지 않음

    2-2) 방문여부를 true로 바꾸고 다음 방향으로 이동 후, 다시 돌아오면 방문여부를 다시 false로 바꿈

 

[풀이 코드_Java]

package book;

import java.util.Scanner;

public class CrazyBot {

    static int n;
    static int[][]      bord;
    static boolean[][]  visited;

    static double[] movePro = new double[4];
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    static double sucProb;

    public static void main(String[] args) {

        // load inputs
        Scanner sc = new Scanner(System.in);
        n            = sc.nextInt();
        movePro[0]   = sc.nextInt() * 0.01;
        movePro[1]   = sc.nextInt() * 0.01;
        movePro[2]   = sc.nextInt() * 0.01;
        movePro[3]   = sc.nextInt() * 0.01;

        // create variable
        bord    = new int[(2 * n) + 1][(2 * n) + 1];
        visited = new boolean[(2 * n) + 1][(2 * n) + 1];

        visited[n][n] = true;
        run(n, n, n, 1.0);

        System.out.println("answer:: " + sucProb);
    }

    public static void run(int x, int y, int n, double culProb) {

        if (n == 0) {  // end condition of recursive
            sucProb += culProb;
            return;
        }

        for (int i = 0; i < 4; i++) {
            double nProb = movePro[i];
            int nx = x + dx[i];
            int ny = y + dy[i];

            // already visited or movePro is zero
            if (visited[nx][ny] || movePro[i] == 0) continue;

            visited[nx][ny] = true;
            run(nx, ny, n - 1, culProb * nProb);
            visited[nx][ny] = false;
        }
    }

}