zoukankan      html  css  js  c++  java
  • 笔试题算法系列(四)百度蘑菇阵

    时间限制: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 }
  • 相关阅读:
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/haimishasha/p/10637829.html
Copyright © 2011-2022 走看看