JAVA 算法练习(二)

和上次一样,虽说用 java 语言,但有 c 的基础一样可以看懂哦。

机器人走方格问题Ⅰ

题目概述

  有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。

测试样例:
2,2
返回:2

解析

  不知道大家记得之前的dfs与bfs吗?这是那种类型题目的求通路数问题。我们之前要求求得到达目的地的最短路程,现在则求有多少条路可达目的地。
  解题方法我觉得像是逐层累加,稍后大家利用表格还原代码过程就可以明白了。
  

代码如下:

public class Text7 {
    public int countWays(int x, int y) {
        int[][] dp = new int[x][y];
        dp[0][0] = 1;
        for (int i = 1; i < x; i++) {
            dp[i][0] = dp[i-1][0];
        }
        for (int i = 1; i < y; i++) {   
            dp[0][i] = dp[0][i-1];
        }
        for (int i = 1; i < x; i++) {
            for (int j = 1; j < y; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[x-1][y-1];
    }
}

大家画图表推演下就懂了。

机器人走方格问题Ⅱ

题目概述

  有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
  给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50。

解析

  这道有障碍的就更像之前的题了。总体思路和上题相同,但是要处理障碍物。根据左上角到右下角总体方向且只能向右或向下走,可以得知除上边界与左边界的方格外,其它方格可以不用处理。
  大家想一想为什么要处理上边界与左边界的方格,该怎么处理呢?
  

代码如下:

public class Robot {
    public int countWays(int[][] map, int x, int y) {
        for (int i = 0; i < x; i++) {
            if (map[i][0] == 0) {
                for (int j = i; j < x; j++)
                    map[j][0] = 0;
            }
        }
    
        for (int i = 0; i < y; i++) {
            if (map[0][i] == 0) {
                for (int j = i; j < y; j++)
                    map[0][j] = 0;
            }
        }
        
        for (int i = 1; i < x; i++) {
            for (int j = 1; j < y; j++) {
                if (map[i][j] == 1) {
                    map[i][j] = map[i][j-1] +     map[i-1][j];
                }
            }
        }
    
        return map[x-1][y-1];
    }
}

附:诗

  鸟儿愿为一朵云。
  云儿愿为一只鸟。
  the bird wishes it were a cloud.
  the cloud wishes it were a bird.
  
             ——泰戈尔《飞鸟集》

以上

原文地址:https://www.cnblogs.com/mxwbq/p/6869512.html