362 words
2 minutes
[BOJ] 미친 로봇
미친 로봇
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
1s | 128MB | (1 ≤ N ≤ 14) | Implementation, Backtracking |
문제는 그냥 재미있었다.. ㅋㅋㅌㅎㅌㅋ
일단 우리가 중요하게 생각할 것은 무엇보다도 오차를 줄이는 것.. 컴퓨터는 기본적으로 소수를 표현할 때 무한 소수나 엄청긴 숫자에 대해서 당연히 오차가 발생하는데 이런 것들을 어떻게 최대한 줄일까? 이런 아이디어만 있으면 쉽게 풀 수 있다.
나는 곱하기로 처리하다가 마지막에만 나눠서 처리하는 방식을 사용했다.
다행히 문제의 최대값 100^14 값이 1e28인데 double로 찍어보니 나와서 double로 맘편히 처리했다.
이번에 cout의 출력 형식 맞추는 것도 새롭게 알아간다
정답 코드
#include <iostream> #include <queue> using namespace std; double probability[4]; int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}; int n; bool visited[50][50]; double solution(int depth, pair<int, int> pos, double current){ if(depth >= n) return current; double local_result = 0; for(int i = 0; i < 4; i++){ int ny = dy[i] + pos.first; int nx = dx[i] + pos.second; if(visited[ny][nx] || probability[i] == 0) continue; visited[ny][nx] = true; local_result += solution(depth+1, {ny, nx}, current*probability[i]); // cout << "local : " << local_result << "\n"; visited[ny][nx] = false; } return local_result; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); // result = 1e28; cin >> n; for(int i = 0; i < 4; i++) cin >> probability[i]; pair<int, int> start = {25, 25}; double d = 1; int i = n; while(i --> 0) d*=100; visited[25][25] = true; double result = solution(0, start, 1); cout.precision(10); cout << (double)(result / d); return 0; }