演算法:網格走法數目
阿新 • • 發佈:2019-02-07
1. 題目描述
有一個X*Y的網格,小團要在此網格上從左上角到右下角,只能走格點且只能向右或向下走。請設計一個演算法,計算小團有多少種走法。給定兩個正整數int x,int y,請返回小團的走法數目。
輸入一行為X,Y;輸出一行為走法數目
2. 思路分析
該題與“走臺階“的題目異曲同工。
根據題目描述,走格時只能向下走或向右走。則假若目標格為(n,m),那麼走向目標節點的走法就有兩種,分別是:
(1)由(n-1,m)格向下走
(2)由(n,m-1)格向右走
所以,對與邊界的格子來說,都只有上述的這兩種走法,所以走向(n,m)格的總走法數目,就是【其上方格點的走法數目】與【其左方格點的走法數目】的和。此時假設函式f(x,y)表示走向格點(x,y)的走法數目,那麼能夠得到:
邊界:
上邊提到的計算只滿足於非上邊、非左邊格子。網格中的第一行格點,只有一種走法即一直向右走;網格中第一列的節點,也只有一種走法即一直向下走。
所以,有了邊界,有了狀態轉移公式,let’s code!
3. c++實現
#include <iostream>
using namespace std;
int findSolution(int X, int Y) {
if (X == 0 && Y == 0)
return 0;
if (X == 0 || Y == 0 ) {
return 1;
}
return findSolution(X-1, Y) + findSolution(X, Y-1);
}
int main() {
int x, y;
cin >> x >> y;
if (x > 10 || x < 1 || y > 10 || y < 1) {
cout << "input errer." << endl;
return 0;
}
int ans = findSolution(x, y);
cout << ans << endl;
return 0;
}