728x90
https://www.acmicpc.net/problem/1405
1405번: 미친 로봇
첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고, 모든 확률은 100보다 작거나 같은 자
www.acmicpc.net
N의 값이 작아
DFS를 돌렸다.
이동할 수 있는 board로 넓직하게 최대 14니까 30x30 board를 만들어 탐색했다.
그리고 입력된 확률을 100으로 나눠서
0.xx 형태로 바꾸고
그 방향으로 갈 때마다 곱해서
누적확률을 최종 도착지에서 더해주었다.
*
답은 잘 나오는데 답은 틀렸다고 나온다
소수점 출력 부분이 잘못된 거 같아
처음으로
cout.precision(n);
을 사용했다.
소수점을 n자리까지 표현하겠다는 뜻이다.
#include <iostream>
#include <vector>
using namespace std;
double total = 0;
vector<double> dir(4);
bool board[30][30];
void dfs(int x,int y,int N,double possible) {
if (x < 0 || y < 0 || x >30 || y > 30 || board[x][y])
return;
if (N == 0) {
total += possible;
return;
}
board[x][y] = true;
if (dir[0]){ // 동
if(!board[x][y+1])
dfs(x, y+1, N - 1, possible * dir[0]);
}
if (dir[1]) { // 서
if (!board[x][y - 1])
dfs(x, y-1, N - 1, possible * dir[1]);
}
if (dir[2]) { // 남
if (!board[x+1][y])
dfs(x+1, y, N - 1, possible * dir[2]);
}
if (dir[3]) { // 북
if (!board[x - 1][y])
dfs(x-1, y, N - 1, possible * dir[3]);
}
board[x][y] = false;
}
int main(void) {
int N;
cin >> N;
for (int i = 0; i < 4; i++) {
cin >> dir[i];
dir[i] /= 100;
}
dfs(15, 15, N , 1);
cout.precision(16);
cout << total;
}
728x90
'문제 > 백준' 카테고리의 다른 글
c++ 백준_2252_"줄 세우기" (0) | 2023.06.16 |
---|---|
c++ 백준_1600_"말이 되고픈 원숭이" (0) | 2023.06.15 |
c++ 백준_1715_"카드 정렬하기" (0) | 2023.06.15 |
c++ 백준_1167_"트리의 지름" (2) | 2023.06.13 |
c++ 백준_1918_"후위 표기식" (2) | 2023.06.13 |