JAVA/알고리즘 문제풀이

[JAVA] boj 1405 미친 로봇

JINGMONG 2021. 12. 27. 20:20

문제 링크 : https://www.acmicpc.net/problem/1405

문제

통제 할 수 없는 미친 로봇이 평면위에 있다. 그리고 이 로봇은 N번의 행동을 취할 것이다.

각 행동에서 로봇은 4개의 방향 중에 하나를 임의로 선택한다. 그리고 그 방향으로 한 칸 이동한다.

로봇이 같은 곳을 한 번보다 많이 이동하지 않을 때, 로봇의 이동 경로가 단순하다고 한다. (로봇이 시작하는 위치가 처음 방문한 곳이다.) 로봇의 이동 경로가 단순할 확률을 구하는 프로그램을 작성하시오. 예를 들어, EENE와 ENW는 단순하지만, ENWS와 WWWWSNE는 단순하지 않다. (E는 동, W는 서, N은 북, S는 남)

입력

첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고,  모든 확률은 100보다 작거나 같은 자연수 또는 0이다. 그리고, 동서남북으로 이동할 확률을 모두 더하면 100이다.

확률의 단위는 %이다.

출력

첫째 줄에 로봇의 이동 경로가 단순할 확률을 출력한다. 절대/상대 오차는 10-9 까지 허용한다.

예제 입력 1

2 25 25 25 25

예제 출력 1

0.75

예제 입력 2

1 25 25 25 25

예제 출력 2

1.0

예제 입력 3

14 25 25 25 25

예제 출력 3

0.008845493197441101

문제 풀이

백트래킹을 이용하여 문제를 해결하였다.

 

이동할 수 있는 방향(확률이 0이 아닌 방향)으로 이동하면서 그 위치로 이동할 수 있는 각각의 확률을 구해가면서 이동해야하는 횟수를 모두 이동하였을 때 단순이동의 경우에 ans에 지금까지의 확률을 더해주는 방법으로 풀었다.

 

코드

import java.io.*;
import java.util.*;

public class Main_BJ_1405_미친로봇 {
  static int N;
  static int [][] D = {{0, 1},{0, -1},{-1, 0},{1, 0}};
  static double [] per;
  static boolean [][] visited;
  static double ans;
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    
    N = Integer.parseInt(st.nextToken());
    per = new double[4];
    
    visited = new boolean [N*2+1][N*2+1];
    
    for (int i = 0 ; i < 4 ; i++) {
      per[i] = Double.parseDouble(st.nextToken())*0.01;
    }
    
    visited[N][N] = true;
    
    dfs(0, N, N, 1);
    
    System.out.println(ans);
  }
  static void dfs(int cnt, int x, int y, double res) {
    if (cnt == N) {
      ans += res;
      return;
    }
    
    for (int i = 0 ; i < 4 ; i++) {
      if (per[i] == 0) {
        continue;
      }
      int nx = x + D[i][0];
      int ny = y + D[i][1];
      
      if (visited[nx][ny]) continue;
      
      visited[nx][ny] = true;      
      dfs(cnt+1 , nx, ny, res*per[i]);
      visited[nx][ny] = false;
    }
  }
  
}

'JAVA > 알고리즘 문제풀이' 카테고리의 다른 글

[JAVA] boj 2267 단지번호붙이기  (0) 2022.03.06
[JAVA] boj 5430 AC  (0) 2021.12.27
[JAVA] boj 1365 꼬인 전깃줄  (0) 2021.12.27
[JAVA] boj 18352 특정 거리의 도시 찾기  (0) 2021.12.27
[JAVA] boj 2565 전깃줄  (0) 2021.12.27