- 생각
조심해야 할 것
1. 동서남북으로 갈 확률이 자연수로 주어지기 때문에 0.01을 곱해 확률로 만들어주기
2. 출력할 때 소수점 10의 자리까지 출력해주기
푼 방식 (DFS)
1. 한 방향으로 최대 14번 움직일 수 있기 때문에 (15, 15)에서 시작하고 판은 적어도 29*29여야 한다.
2. 한번 움직일 때마다 4방향 다 움직이면서 브루트 포스 알고리즘을 적용하여 답을 탐색한다.
3. N번 움직였을 경우 누적 확률을 더해주면 됩니다.
- 코드
import java.io.IOException;
import java.io.InputStream;
import java.util.InputMismatchException;
public class Main {
static int N;
static double percentage;
static double[] percent; // 각 방향으로 이동할 확률
static boolean[][] check; // 단순 경로인지 아닌지 체크
static int[] x = { -1, 1, 0, 0 };
static int[] y = { 0, 0, -1, 1 };
public static void main(String[] args) throws Exception {
SetData();
dfs(14, 14, 0, 1.0);
System.out.println(percentage);
}
// 데이터
private static void SetData() throws Exception {
InputReader in = new InputReader(System.in);
percent = new double[4];
check = new boolean[30][30];
percentage = 0.0;
check[14][14] = true;
N = in.readInt();
// 입력값을 확률로 바꿈
for (int i = 0; i < 4; i++)
percent[i] = in.readInt() * 0.01;
}
private static void dfs(int a, int b, int count, double per) {
// basecase
if (count == N) {
percentage += per;
return;
}
// 4방향 이동
for (int i = 0; i < 4; i++) {
int r = a + x[i];
int c = b + y[i];
if (!check[r][c]) {
check[r][c] = true;
dfs(r, c, count + 1, per * percent[i]);
check[r][c] = false;
}
}
}
private static class InputReader {
private InputStream stream;
private byte[] buf = new byte[1024];
private int curChar;
private int numChars;
private SpaceCharFilter filter;
public InputReader(InputStream stream) {
this.stream = stream;
}
public int read() {
if (numChars == -1) {
throw new InputMismatchException();
}
if (curChar >= numChars) {
curChar = 0;
try {
numChars = stream.read(buf);
} catch (IOException e) {
throw new InputMismatchException();
}
if (numChars <= 0) {
return -1;
}
}
return buf[curChar++];
}
public int readInt() {
int c = read();
while (isSpaceChar(c)) {
c = read();
}
int sgn = 1;
if (c == '-') {
sgn = -1;
c = read();
}
int res = 0;
do {
if (c < '0' || c > '9') {
throw new InputMismatchException();
}
res *= 10;
res += c - '0';
c = read();
} while (!isSpaceChar(c));
return res * sgn;
}
public boolean isSpaceChar(int c) {
if (filter != null) {
return filter.isSpaceChar(c);
}
return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
}
public interface SpaceCharFilter {
public boolean isSpaceChar(int ch);
}
}
}
'algorithm' 카테고리의 다른 글
[BOJ/JAVA] 백준 1520번 : 내리막 길 (0) | 2021.01.27 |
---|---|
[BOJ/JAVA] 백준 7576번 : 토마토 (0) | 2021.01.26 |
[BOJ/JAVA] 백준 1477번 : 휴게소 세우기 (0) | 2021.01.25 |
[BOJ/JAVA] 백준 14502번 : 연구소 (공부 더 해보기) (0) | 2021.01.24 |
[BOJ/JAVA] 백준 7579번 : 앱 (0) | 2021.01.24 |