想起来就记录一道题系列(一)

废话少说,直接上题!

题干

想起来就记录一道题系列(一)_第1张图片

  这道题大概意思就是一只蚂蚁从要左上角爬到右下角,只能沿着方格的线走而且不能走回头路,走到死胡同就GG只能右上角重来。要求我们帮助蚂蚁统计一下它的成功率。

思路

  所谓成功率就是成功次数除以尝试次数,可以用蒙特卡洛法来解题。
  蒙特卡洛法的基本思想是:为了求解问题,首先建立一个概率模型或随机过程,使它的参数或数字特征 等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。解的精确度用估计值的标准误差来表示。蒙特卡洛法的主要理论基础是概率统计理论,主要手段是随机抽样、统计试验。用蒙特卡洛法求解实际问题的基本步骤为:
    (1)根据实际问题的特点.构造简单而又便于实现的概率统计模型.使所求的解恰好是所求问题的概率分布或数学期望;
    (2)给出模型中各种不同分布随机变量的抽样方法;
    (3)统计处理模拟结果,给出问题解的统计估计值和精度估计值。
    也就是统计蚂蚁成功到达右下角的次数最后再除以它的尝试次数就是成功率。
    我们来分析一下蚂蚁的状态:
  首先他沿着方格的线的走只有这四种方向可以走:向上、向下、向左和向右。小蚂蚁从左上角开始走,只有两种状态,向下或者向右。如果它向右走,又可以选择两种方向,向下或者继续向右,依次类推。由于蚂蚁每走一步都是一个随机事件,他可以向下也可以向右,所以我们可以在蚂蚁走每一步之前先判断它可以走的路线,然后再随机选一条路走,如果遇到死路就回到左上角重新开始,成功达到右下角就记录本次路线为成功。由于蚂蚁不能走回头路,我们还要记录它每次走的方向。

实现

定义一个二维数组存储小蚂蚁走过的路径

   private static boolean vis[][] = new boolean[10000][10000];

判断小蚂蚁每次所走的方向,若遇到死路则开始下一次尝试返回false,若成功到达右下角则返回true

  private static boolean dfs(int x,int y){
        //方格阶数
        int N = 5;
        int tx1 ,ty1,tx2,ty2,tx3,ty3,tx4,ty4;
        List<String>list =new ArrayList<>();
        if (x ==N+1 && y==N+1 ){
//            System.out.println(x + " , "+ y);
            vis = new boolean[100][100];
//            System.out.println("恭喜");
            return true;
        }
        vis[x][y] = true;
//        System.out.println(x + " , "+ y);
        //向上
        if (y>1) {
            tx1 = x;
            ty1 = y - 1;
            if (vis[tx1][ty1] == false && ty1 >= 1) {
                list.add("上");
            }
        }
        //向下
        tx2 = x;
        ty2 = y+1;
        if (vis[tx2][ty2] == false && ty2 <= N+1){
            list.add("下");
        }
        //向左
        if (x>1) {
            tx3 = x - 1;
            ty3 = y;
            if (vis[tx3][ty3] == false && tx3 >= 1 ) {
                list.add("左");
            }
        }
        //向右
        tx4 = x+1;
        ty4 = y;
        if (vis[tx4][ty4] == false && tx4 <= N+1){
            list.add("右");
        }
        if (list.size() > 0 ){
            Random random =new Random();
            int directionNum = random.nextInt(list.size());
            String direction = list.get(directionNum);
            if (direction.equals("上")){
//                System.out.print("上");
                return dfs(x,y-1);
            }
            else if (direction.equals("下")){
//                System.out.print("下");
                return dfs(x,y+1);
            }
            else if (direction.equals("左")){
//                System.out.print("左");
                return dfs(x-1,y);
            }
            else if (direction.equals("右")){
//                System.out.print("右");
                return dfs(x+1,y);
            }
        }
         vis = new boolean[100][100];
//         System.out.println("失败");
         return false;

    }

你可能感兴趣的:(做题,java,算法)