题目描述
现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?
输入描述:
第一行N,M,K(2 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。
输出描述:
输出一行,代表所求概率(保留到2位小数)
输入例子:
2 2 1
2 1
输出例子:
0.50
解题思路:
题目要求的是不碰到蘑菇的概率,一开始我使用路径数的方法来求解的(p=不碰到蘑菇的走法/所有的走法),但是一直都未能通过所有测试。后来认真研究了下题目,也看了些网上的一些资料。题目要求要计算不碰到蘑菇的概率,因为走的概率不均等,如
2 3的蘑菇阵
1 2 3
4 5 6
从1 走到6
1-2的概率为0.5,2-3概率为0.5,3-6概率为1
1-4的概率为0.5,2-5概率为0.5,4-5概率为1,5-6概率为1,3-6概率为1
若走1-2-3-6概率为0.25,1-2-5-6概率为0.25,而走1-4-5-6的概率为0.5
所以三种走法的概率不均等,所以算其不碰到蘑菇的概率不可以用枚举路径数的方法计算。只能往两个方向走,所以两个方向的概率都是0.5,但是在边界处只有一种走法也就是该走法的概率为1,需要单独对边界进行处理。
不是边界的计算不碰到蘑菇的概率:
ways[i][j] = ways[i-1][j] * 0.5 * (map[i-1][j] + 1)%2+ ways[i][j-1] * 0.5 (map[i-1][j] + 1)%2 即为上面和左边的方向过来,前提上面和左边都没有蘑菇
边界的处理:
最底端第n行:ways[i][j] = ways[i][j-1] * (map[i-1][j] + 1)%2
最右边第m列:ways[i][j] = ways[i-1][j] * (map[i-1][j] + 1)%2
public static double getProbability(int map[][], int n, int m) {
double ways[][] = new double[n][m];// 没走蘑菇阵的概率
ways[0][0] = 1;
// int ti = 0, tj = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
//注意处理单行和单列的问题
if (j == m - 1 && i - 1 >= 0) {
// 最右边
ways[i][j] += ways[i - 1][j];
}
if (i == n - 1 && j -1 >=0) {
// 最下边
ways[i][j] += ways[i][j - 1];
}
if(i - 1 >= 0)//不止一行
if (map[i - 1][j] != 1 && j != m - 1) {