알고리즘/백준

[백준 1405] 미친 로봇

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

 

1405번: 미친 로봇

첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고,  모든 확률은 100보다 작거나 같은 자��

www.acmicpc.net

  • 유형
    dfs
  • 로직
    dfs를 돌린다 -> 재방문 하는 곳은 리턴 -> dfs를 돌리면서 방향에 맞는 확률도 같이 계산해서 파라미터로 넘겨준다
    -> 주어진 N 만큼 깊이로 탐색을 했을 시 확률을 더해준다
  • 코드
package 백준;

import java.util.Scanner;

public class 미친로봇1405 {
	static int dr[]= {0,0,1,-1};
	static int dc[]= {1,-1,0,0};
	static boolean visit[][];
	static int n;
	static double d[]=new double[4];
	static int map[][];
	static double total=0;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		for (int i = 0; i < d.length; i++) {
			d[i] = sc.nextInt()*0.01;
		}
		map = new int[30][30];
		visit = new boolean[30][30];
		visit[14][14]=true;
		dfs(14,14, 0, 1);
		System.out.println(total);
	}
	static void dfs(int r, int c, int depth, double sum) {
		//총 n 번 이동한 경우
		if(depth == n) {
			total+=sum;
			return;
		}
		for (int i = 0; i < d.length; i++) {
			int nr = r+dr[i];
			int nc = c+dc[i];
			if(visit[nr][nc])
				continue;
			visit[nr][nc] = true;
			dfs(nr,nc, depth+1, d[i]*sum);
			visit[nr][nc]=false;
		}
	}
}
/*
재방문x -> 단순함
재방문o -> 단순안함
돌아오지 않는 경우들/전체  -> n을 재한 걸고 -> 재방문 한경우 카운트 -> 끝까지 간 경우 카운트
마지막에 나누셈을 계산

*/

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

[백준 14002] 골드4 - 가장 긴 증가하는 부분수열4  (0) 2020.09.24
[백준 10157] 자리배정  (0) 2020.09.20
백준 16234 인구 이동  (0) 2020.03.13
백준 15686 치킨 배달  (0) 2020.03.13
백준 15685 드래곤 커브  (0) 2020.03.13