笔试面试题-蘑菇阵

题目描述

现在有两个好友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

 

思路:一开始用可行路径除以所有路径去做,发现是错的,因为不同路径的概率是不一样的。这题还得用概率进行动态规划。

 1 import java.util.*;
 2 /**
 3  * Created by Jiang on 2016/5/27.
 4  */
 5 public class Solution {
 6     public static void main(String[] args) {
 7         double[][] dp = new double[21][21];
 8         Scanner in = new Scanner(System.in);
 9         while (in.hasNext()) {
10             int N = in.nextInt();
11             int M = in.nextInt();
12             int K = in.nextInt();
13             for (int i = 0; i < 21; i++) {
14                 Arrays.fill(dp[i], 0);
15             }
16             for (int col = 0; col < K; col++) {
17                 int x = in.nextInt();
18                 int y = in.nextInt();
19                 dp[x][y] = 1;
20             }
21             //通过从1开始遍历,省去对第0行,0列的特殊处理。
22             for (int col = 1; col <= M; col++) {
23                 for (int row = 1; row <= N; row++) {
24                     if (dp[row][col] == 1) {
25                         dp[row][col] = 0;
26                     }
27                     //第一个元素
28                     else if (row == 1 && col == 1) {
29                         dp[row][col] = 1;
30                     }
31                     //最后一个元素
32                     else if (row == N && col == M) {
33                         dp[row][col] = dp[row - 1][col] + dp[row][col - 1];
34                     }
35                     //最后一行
36                     else if (row == N) {
37                         dp[row][col] = 0.5 * dp[row - 1][col] + dp[row][col - 1];
38                     }
39                     //最后一列
40                     else if (col == M) {
41                         dp[row][col] = dp[row - 1][col] + 0.5 * dp[row][col - 1];
42                     }
43                     else {
44                         dp[row][col] = 0.5 * (dp[row - 1][col] + dp[row][col - 1]);
45                     }
46                 }
47             }
48             System.out.println(String.format("%.2f", 1.0 * dp[N][M]));
49         }
50     }
51 }

 

 

posted on 2016-05-28 10:14  北门煎饼东门串儿  阅读(306)  评论(0编辑  收藏  举报

导航