문제풀이/백준
[백준]1405: 미친 로봇 - JAVA
빈둥벤둥
2021. 3. 12. 14:27
[백준]1405: 미친 로봇
1405번: 미친 로봇
첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고, 모든 확률은 100보다 작거나 같은 자
www.acmicpc.net
풀이
DFS + 백트래킹을 사용하여 풀었다.
결국엔 문제에서 구하는 값은 같은 곳을 방문하지 않고 N번동안 이동할 때의 확률을 구하는 것이다. 즉 DFS를 사용하여 N번만큼 이동하되 visited 함수를 사용하여 같은 공간은 방문하지 않도록 처리하면 된다.
이때 이동할 확률을 구하는 방법은 같은 공간을 방문하지 않고 이동하며, 이동할 때매다 이동할 방향의 확률을 곱해서 그 값을 모두 더해주면 된다.
예를들어 N이 2이고 동 서 남 북으로 이동할 확률이 각각 25라고 할때 동 -> 동으로 이동할 확률은 다음과 같다.
동 -> 동 = 25(동) * 25(동)이 된다.
즉, DFS로 한 방향으로 계속 방문하되, 이전에 방문한 곳은 방문하지 않으며 해당 방향으로 이동할 때 그 방향의 확률을 곱해주고 N번 이동이 끝나면 그 값을 결과값에 더해주면 된다.
이때 N의 최대값은 15이다. 그러므로 시작지점을 15, 15로 잡고 최소 좌표값을 0, 0/ 최대 좌표값을 30, 30으로 설정해주었다.
코드
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
|
import java.util.*;
public class Main {
static int[] dx = {0, 0, 1, -1}; //동 서 남 북 순서
static int[] dy = {1, -1, 0, 0};
static double[] percent;
static boolean[][] visited;
static double result;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
percent = new double[4];
for(int i = 0; i < 4; i++) {
percent[i] = scan.nextInt() * 0.01;
}
visited = new boolean[30][30]; //시작점을 15, 15로 잡기 위함.
result = 0;
dfs(15, 15, 0, n, 1);
System.out.println(result);
}
public static void dfs(int x, int y, int idx, int n, double total) {
if(idx == n) {
result += total;
return;
}
visited[x][y] = true;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && ny >= 0 && nx < 30 && ny < 30) {
if(visited[nx][ny] == false) {
visited[nx][ny] = true;
dfs(nx, ny, idx + 1, n, total * percent[i]);
visited[nx][ny] = false;
}
}
}
}
}
|
cs |