https://www.acmicpc.net/problem/1405
1. 로봇은 방문했던 곳을 방문하지 않고 정해진 횟수의 이동을 끝내는 경우를, 단순한 경로라고 한다. 단순한 경로들을 찾아가면서, 발생할 확률들의 합을 구하면 정답이 된다.
2. 로봇의 방문을 DFS를 통해서 전체 탐색을 하도록 한다.
해설코드(Java).
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
48
49
50
51
52
53
54
55
56
|
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
static int N;
static int[][] op = {{0,1},{0,-1},{1,0},{-1,0}};
static double[] perArr = {0,0,0,0};
static boolean[][] chk;
public static double dfs(int r, int c, int move, double percent){
if(move == N)
return percent;
double result = 0;
for(int i = 0; i < op.length; i++){
int nr = r + op[i][0];
int nc = c + op[i][1];
if(chk[nr][nc] == false)
{
chk[nr][nc] = true;
result += dfs(nr, nc, move + 1, percent * perArr[i]);
chk[nr][nc] = false;
}
}
return result;
}
public static void main (String[] args) throws java.lang.Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] sArr = br.readLine().split(" ");
chk = new boolean[14 * 2 + 1][14 * 2 + 1];
for(int i = 0; i < chk.length; i++){
for(int j = 0; j < chk[i].length; j++){
chk[i][j] = false;
}
}
N = Integer.valueOf(sArr[0]);
perArr[0] = Double.valueOf(sArr[1]) / 100;
perArr[1] = Double.valueOf(sArr[2]) / 100;
perArr[2] = Double.valueOf(sArr[3]) / 100;
perArr[3] = Double.valueOf(sArr[4]) / 100;
chk[14][14] = true;
bw.write(dfs(14,14,0,1) + "\n");
bw.flush();
}
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 1024] 수열의 합(Java, 단순한 풀이) (0) | 2020.08.19 |
---|---|
[BOJ 1068] 트리(Java, 간단한 풀이, Set) (0) | 2020.08.19 |
[BOJ 2616] 소형기관차(Java, Dynamic Programming, 동적계획법, Bottom-up, Top-down 풀이) (0) | 2020.08.16 |
[BOJ 1933] 스카이라인(Java, Treemap, 설명, 간단한 코드) (0) | 2020.08.12 |
[BOJ 1863] 스카이라인 쉬운거(Java, Stack) (0) | 2020.08.12 |