1. 程式人生 > >演算法:網格走法數目

演算法:網格走法數目

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)的走法數目,那麼能夠得到:

f(x,y)=f(x1,y)+f(x,y1)

邊界:
  上邊提到的計算只滿足於非上邊、非左邊格子。網格中的第一行格點,只有一種走法即一直向右走;網格中第一列的節點,也只有一種走法即一直向下走。
  所以,有了邊界,有了狀態轉移公式,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; }