본문 바로가기
알고리즘/백준 & swacademy

BOJ 1405 - 미친 로봇

by sun__ 2019. 8. 6.

https://www.acmicpc.net/problem/1405

 

1405번: 미친 로봇

첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고,  모든 확률은 100보다 작거나 같은 자연수 또는 0이다. 그리고, 동서남북으로 이동할 확률을 모두 더하면 100이다.

www.acmicpc.net

아.. 이문제

풀이는 쉽지만 setprecision을 사용하는 경우에 대해서 배운 문제다

 

#include <iostream>
using namespace std;
const int dy[4]{ 0,0,1,-1 };
const int dx[4]{ 1,-1,0,0 };

int n;
long double per[4];
bool visited[30][30];

long double rst = 0;
void dfs(int cy, int cx, int cnt, long double temp) {
	if (cnt == n) {
		rst += temp;
		return;
	}
	for (int i = 0; i < 4; i++) {
		int ny = cy + dy[i], nx = cx + dx[i];
		if (!visited[ny][nx]){
			visited[ny][nx] = true;
			dfs(ny, nx, cnt + 1, temp * per[i]);
			visited[ny][nx] = false;
		}
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < 4; i++) {
		long double input; cin >> input;
		per[i] = input / 100;
	}

	visited[15][15] = true;
	dfs(15, 15, 0, 1);
	cout.precision(11); //이거 안넣어줘서 5번 틀림..
    cout << rst << '\n';
}

 

한 방향으로 최대 14번 움직이니까 r=30 c=30배열의 (15,15)좌표에서부터 dfs+백트래킹 해주면서 확률을 곱하고 더하고 하였다.

'알고리즘 > 백준 & swacademy' 카테고리의 다른 글

BOJ 1194 - 달이 차오른다, 가자  (0) 2019.08.06
BOJ 2098 - 외판원 순회 TSP  (0) 2019.08.06
BOJ 11562 - 백양로 브레이크  (0) 2019.08.06
BOJ 11780 - 플로이드2  (0) 2019.08.06
BOJ 1300 - K번째 수  (0) 2019.07.29