第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題
機器人走方格
一、問題:
有一個X*Y的網格,一個機器人只能走格點且只能向右或向下走,要從左上角走到右下角。 請設計一個演算法,計算機器人有多少種走法。 給定兩個正整數int x,int y,請返回機器人的走法數目,保證x+y小於等於12。
二、思路:
思考這類看起來很複雜的問題,實際上就越有規律可循,我們先列舉一些簡單的情況,再由簡到繁,逐步得出結果,逐步發現規律。就是說先解決簡單情況下的問題,然後再推廣到複雜情況下的問題。就比如這道題目,先假如只有1個格子,那很明顯只有一種走法,那麼我們再去畫 1 * 2,2 * 1,1 * 3,3 * 1,也只有1種走法,再去畫2 * 2 的方格,發現有兩種走法了。
當我們處於2 * 2的方格的時候我們可以首先往右走一個方格,那麼此時我們處於兩行一列的狀態,我們也可以往下走一個方格那麼我們處於一行兩列的情況那麼1 * 2與2 * 1的走法我們原來是知道的,所以把這兩種走法加起來就得到了2 * 2 方格的走法,也就是兩種走法。
當我們處於2 * 3的方格的時候我們可以首先往右走一個方格,那麼此時我們處於兩行兩列的狀態,我們也可以往下走一個方格那麼我們處於一行三列的情況那麼2 * 2與1 * 3的情況我們原來是知道的,所以把這兩種走法加起來就得到了2 * 3 方格的走法總共有3種走法,依次類推
於是我們根據分析就可以得出遞推式f(x , y) = f(x - 1, y) + f(x , y - 1)(因為只能向右走和向下走)
所以我們可以使用遞迴的方式來解決這個問題,其次我們也可以使用迭代(遞推)的方式來解決,因為涉及到兩個變數都在變化,使用一維的變數是不能夠儲存的,所以要使用二維的資料結構:二維陣列來儲存從起始點到某一點的走法,比如說a[2][3]=3,表示機器人到這一個點總共有3種走法。
使用遞迴的話就相當於一種富人的思想,把什麼都交給手下人去做,自己只負責合併結果,程式碼很簡潔。而迭代(遞推)相當於打工者的思想,一步步根據自己的分析得出想要的結果,程式碼相對來說比遞迴要複雜一點。
三、程式碼:
public class 機器人走格子 {
public static void main(String[] args) {
System.out.println(solve(3, 3)); // 輸出 6
System.out.println(solve1(3, 3)); // 輸出 6
}
/**
* 遞迴形式
*/
static int solve(int x,int y){
if( x==1 || y==1 ) return 1;
return solve(x-1, y)+solve(x, y-1);
}
/**
* 迭代形式
*/
static int solve1(int m,int n){
int [][]state = new int[m+1][n+1];
for (int i = 1; i <= n; i++) {
state[1][i] = 1;
}
for (int i = 1; i <= m; i++) {
state[i][1] = 1;
}
for (int i = 2; i <=m ; i++) {
for (int j = 2; j <=n ; j++) {
state[i][j] = state[i][j-1] + state[i-1][j];
}
}
return state[m][n];
}
}
四、結果:
相關文章
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.5 “逐步生成結果”之非數值型問題 (合法括號)遞迴
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.4 硬幣表示某個給定數值遞迴
- 數獨問題(DFS+回溯)
- 遞迴問題遞迴
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- 遞迴解決全排列問題遞迴
- 回溯問題
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 遞迴-*全排列問題遞迴
- 遞迴路徑問題遞迴
- n皇后問題--回溯法,以DFS的方式搜尋
- dfs的return時機問題
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 樹遞迴問題的求解遞迴
- 機器學習:迴歸問題機器學習
- 機器人跳躍問題機器人
- 遞迴求解漢諾塔問題遞迴
- python3:遞迴解漢諾塔問題Python遞迴
- 回溯問題Python框架總結——排列組合問題Python框架
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴
- Acwing166 數獨題解 - DFS剪枝最佳化
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 回溯法解決全排列問題總結
- RPA機器人解決企業什麼問題機器人
- 回溯法求迷宮問題
- Java解決遞迴造成的堆疊溢位問題Java遞迴
- 以Top-Down思維去解決問題——遞迴遞迴
- HDU - 2553 N皇后問題(DFS)
- 決策樹減支問題(優化)dfs減支問題優化
- 【LeetCode回溯演算法#07】子集問題I+II,鞏固解題模板並詳解回溯演算法中的去重問題LeetCode演算法
- 回溯法(排列樹)解決八(N)皇后問題
- poj 1321 棋盤問題 回溯 JavaJava
- 第二章 :查詢與排序-------遞迴經典問題——漢諾塔問題排序遞迴
- 演算法系列-動態規劃(3):找零錢、走方格問題演算法動態規劃
- 多機器人協作排程問題機器人