题目描述
现在有两个好友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(1 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。
输出描述:
输出一行,代表所求概率(保留到2位小数)
示例1
输入
2 2 1
2 1
输出
0.50
// 不能使用:求出无蘑菇时一共又多少种走到的方式,把蘑菇的位置从地图上扣掉 再进行动态规划找有几种方式
// 因为移动到每一格的概率是不同的。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int N = scan.nextInt();
int M = scan.nextInt();
int k = scan.nextInt();
int[][] mushroom = new int[k][2];
for(int i = 0; i < k; i++){
mushroom[i][0] = scan.nextInt(); //mushroom用来储存蘑菇的位置
mushroom[i][1] = scan.nextInt();
}
double[][] map = new double[N+1][M+1]; // map储存到达当前位置有几种路线
for(int[] a : mushroom){
map[a[0]][a[1]] = -1;
}
map[1][1] =1;
for(int i = 1; i <=N ; i++){
for(int j =1; j <=M; j++){
if(map[i][j] != -1){
if(map[i-1][j] != -1)
map[i][j] += j==M ? map[i-1][j] : map[i-1][j]/2 ;
//这里卡了很久:对于最上面的边来说,它可以选择向下走或者向右走,因此最上边每往右一步,概率都*0.5
//对于最右的边来说,它上面的一格没有选择,只能向下移动,因此是上面一格的概率+左边概率*0.5
if(map[i][j-1] != -1)
map[i][j] += i==N ? map[i][j-1] : map[i][j-1]/2;
}
}
}
System.out.printf("%.2f\n",map[N][M]);
}
}
}