笔试题算法系列(四)百度蘑菇阵
时间限制:1秒
空间限制:32768K
现在有两个好友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
输出例子1:
0.50
分析:动态规划
代码如下:
1 import java.util.Scanner; 2 3 public class Main{ 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 String [] line; 7 while(sc.hasNext()){ 8 line = sc.nextLine().split(" "); 9 int n = Integer.parseInt(line[0]); 10 int m = Integer.parseInt(line[1]); 11 int k = Integer.parseInt(line[2]); 12 boolean[][] grid = new boolean[n+1][m+1]; 13 double [][] p = new double[n+1][m+1]; 14 for(int i=0; i<k; i++){ 15 line = sc.nextLine().split(" "); 16 int x = Integer.parseInt(line[0]); 17 int y = Integer.parseInt(line[1]); 18 grid[x][y] = true; 19 } 20 for(int i=1; i<n+1; i++){ 21 for(int j=1; j<m+1; j++){ 22 if(i==1 && j==1){ 23 p[i][j] = 1; 24 continue; 25 } 26 if(grid[i][j]){ 27 p[i][j] = 0; 28 continue; 29 } 30 if(i==n && j ==m){ 31 p[i][j] = p[i][j-1]+p[i-1][j]; 32 }else if(i==n){ 33 p[i][j] = p[i][j-1]+p[i-1][j]*0.5; 34 }else if(j==m){ 35 p[i][j] = p[i][j-1]*0.5 + p[i-1][j]; 36 }else{ 37 p[i][j] = p[i][j-1]*0.5 + p[i-1][j]*0.5; 38 } 39 40 } 41 } 42 System.out.println(String.format("%.2f", p[n][m])); 43 } 44 sc.close(); 45 } 46 }