링크: https://www.algospot.com/judge/problem/read/NUMB3RS
문제 두니발 박사의 탈옥이다. 두니발 박사가 감옥에서 탈출했다. 두니발 박사는 연결되어 있는 마을을 통해 이동하는데 이때 규칙을 따른다.
이 때 d일 이후에 두니발 박사가 각 마을에 있을 확률을 계산하는 프로그램을 작성하라.
입력 첫 줄에는 테스트 케이스 C(1<=C<=50)이 주어진다. 그 후 각 줄에 지도에 포함된 마을의 수 N(2<=N<=50)과 탈출 후 지금까지 지난 일수 D(1<=D<=100) 교도소가 있는 마을의 번호 P(0<=P<N)이 주어진다. 그 후에 행렬 A가 주어진다. 행렬은 각 마을을 잇는 산길이 있음을 의미한다. 그 다음 줄에 마을의 수 T(0<=T<N)이 주어지고, 다음 줄에 T개의 정수로 확률이 계산할 마을의 번호 Q가 주어진다.
2
5 2 0
0 1 1 1 0
1 0 0 0 1
1 0 0 0 0
1 0 0 0 0
0 1 0 0 0
3
0 2 4
8 2 3
0 1 1 1 0 0 0 0
1 0 0 1 0 0 0 0
1 0 0 1 0 0 0 0
1 1 1 0 1 1 0 0
0 0 0 1 0 0 1 1
0 0 0 1 0 0 0 1
0 0 0 0 1 0 0 0
0 0 0 0 1 1 0 0
4
3 1 2 6
#include <cstdio>
#include <cstring>
int n,d,p,Q;//n은 마을의 수, d는 일수
//p는 교도소가 있는 마을의 번호, Q: 확률을 알아내기 위한 마을 번호
int arr[51][51], deg[51];
double cache[51][101];
double search(int here, int days){
if(days == 0) return (here == p ? 1.0: 0.0);
double& ret = cache[here][days];
if(ret > -0.5) return ret;
ret = 0.0;
for(int there = 0; there < n; there++)
if(arr[here][there])
ret += search(there, days - 1) / deg[there];
return ret;
}
// here에 올 확률은 here과 연결되어 있는 (there에 올 확률) *
// (there이 연결되어 있는 마을의 수)의 합이다.
int main(){
int C; // c는 test case
int T;// T에 관한 마을의 수
double ans;
scanf("%d", &C);
while(C--){
memset(cache, -1, sizeof(cache));
memset(deg, 0, sizeof(deg));
scanf("%d %d %d", &n, &d, &p);
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
scanf("%d", &arr[i][j]);
deg[i] += arr[i][j];
}
}
scanf("%d", &T);
for(int i = 0; i<T; i++){
scanf("%d", &Q);
ans = search(Q, d);
printf("%.8f ", ans);
}
printf("\n");
}
return 0;
}
특징