7_15_2013 D: 弹球II

Problem D: 弹球II

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 39   Solved: 19
[ Submit][ Status][ Web Board]

Description

游戏厅里有一种很常见的游戏机,里面有很多根管子有规律地排成许多行。小球从最上面掉下去,碰到管子会等概率地往管子左边或者右边的空隙掉下去。不过在最靠边的小球只会往一边掉(如图,灰色小球只可能掉到右边空隙)。现在已知共2 * n - 1行管子,第i行有Ai个管子,如果i是奇数,那么Ai等于m,如果i是偶数,Ai等于m - 1。小球从第1行第k个管子右边掉下去,要求小球从最后一行各个出口掉出来的概率。 
7_15_2013 D: 弹球II

Input

第一行是一个整数t1≤t≤50),表示有t组测试数据。 
每组数据第一行有两个整数n1≤n≤100)和m2≤m≤10),表示有2*n-1行管子,奇数行有m个管子,偶数行有m-1个管子。 
第二行是一个整数k1≤k≤m-1),表示小球从第1行第k个管子右边掉下去。 

Output

输出m-1个小数,第i个数表示小球从最后一行第i个出口出来的概率。 
每个小数保留小数点后六位,小数与小数之间用一个空格隔开。 

Sample Input

1 3 

3 2

Sample Output

0.375000 

0.625000

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

int
main()
{
	int t, n, m, k;
	double s[210][20];
	scanf("%d", &t);
	while(t--){
		scanf("%d %d %d", &n, &m, &k);
		memset(s, 0, sizeof(s));
		s[1][k]=1;
		for(int i=2; i<=2*n-1; i++){
			for(int j=1; j<=m; j++){
				if(i%2==0){
					s[i][j] = s[i-1][j-1]*0.5 + s[i-1][j]*0.5;
					//printf("i=%d j=%d s[i][j]=%.6lf \n", i, j, s[i][j]);
				}
				else{
					s[i][j] = s[i-1][j]*0.5 + s[i-1][j+1]*0.5;
					if(j==1){
						s[i][j] += s[i-1][j]*0.5;
					}
					if(j==m-1){
						s[i][j] += s[i-1][j+1]*0.5;
						s[i][m]=0;
					} 
				}
			}
		}
		for(int i=1; i<=2*n-1; i++){
			for(int j=1; j<=m; j++){
				printf("%.6lf ", s[i][j] );
			}
			printf("\n");
		}
		
		
		for(int i=1; i<=m-1; i++){
			printf("%.6lf", s[2*n-1][i]);
			if(i!= m)printf(" ");
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(7_15_2013 D: 弹球II)