1. 程式人生 > >機器人走方格

機器人走方格

1.問題描述:

 有一個X*Y的網格,一個機器人只能走格點且只能向右或向下走,要從左上角走到右下角。
 請設計一個演算法,計算機器人有多少種走法
 給定兩個正整數int x,int y,請返回機器人的走法數目,保證x+y小於等於12

2.一開始的時候很正常都是沒有思路的,所以把問題想得很複雜那麼但是越複雜的時候我們越需要冷靜,這個時候我們就需要使用一些簡單的例子幫助我們來分析問題,因為這些簡單的問題在某些情況下可以把大的問題分解成更小的問題直到最後有了解決問題的方案

我們一開始可以畫出一個1 * 1的方格,那麼很容易觀察得到只有一種走法,我們可以畫出1 * 2, 2 * 1, 2 * 2的方格...

1 * 1: 一種走法

1 * 2:一種走法

2 * 1:一種走法

2 * 2: 兩種走法

 

當我們處於2 * 2的方格的時候我們可以往右走一個方格,那麼此時我們處於兩行一列的狀態,我們也可以往下走一個方格那麼我們處於一行兩列的情況那麼1 * 2與2 * 1的走法我們原來是知道的,所以把這兩種走法加起來就得到了2 * 2 方格的走法

2 * 3::三種走法:

當我們處於2 * 2的方格的時候我們可以往右走一個方格,那麼此時我們處於兩行兩列的狀態,我們也可以往下走一個方格那麼我們處於一行三列的情況那麼2 * 2與1 * 3的情況我們原來是知道的,所以把這兩種走法加起來就得到了2 * 3 方格的走法總共有3中走法

....

那麼後面的例子也是這樣來分析,這樣我們分析出來f(x , y) = f(x - 1, y) + f(x , y - 1)(因為只能向右走和向下走)

所以我們可以使用遞迴的方式來解決這個問題,其次我們也可以使用遞推的方式來解決,因為涉及到兩個變數都在變化,使用一維的變數是不能夠儲存的,所以要使用二維的資料結構:二維陣列來儲存其中的臨時的值, x 和 y確定一個值

使用遞迴的話那麼會消耗一定棧空間,因為每次呼叫一個方法那麼都會開闢一個棧空間來儲存臨時的變數,但是程式碼寫起來會非常的簡潔,使用遞推的方式有時候可以節約一定的空間,效率有時候會比遞迴的方式來解決要高很多,因為有可能只開闢一些很小的空間來儲存變數,但是程式碼會比較多一點。這兩種方法都可以鍛鍊程式設計師邏輯思維的養成,所以來說是比較好的

3. 遞迴和遞推的方式來具體的程式碼如下:


import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int y = sc.nextInt();
        int res = solve(x, y);
        System.out.println(res);
        res = solve1(x, y);
        System.out.println(res);
    }

    private static int solve(int x, int y){
        //使用遞迴的方式來解決
        if(x == 1 || y == 1)return 1;
        return solve(x - 1, y) + solve(x, y - 1);
    }
    
    private static int solve1(int m, int n){
        int state[][] = new int [m + 1][n + 1];
        //進行初始化
        for(int i = 0; i <= m; i++){
            state[i][1] = 1;
        }
        for(int i = 0; i <= n; i++){
            state[1][i] = 1;
        }
        //從第二行與第二列進行填充
        for(int i = 2; i <= m; i++){
            for(int j = 2; j <= n; j++){
                state[i][j] = state[i - 1][j] + state[i][j - 1];
            }
        }
        return state[m][n];
    }
}