題目描述
請編寫一個函數(允許增加子函數),計算n x m的棋盤格子(n爲橫向的格子數,m爲豎向的格子數)沿着各自邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即:只能往右和往下走,不能往左和往上走。
輸入描述:
輸入兩個正整數
輸出描述:
返回結果
示例1
輸入
2
2
輸出
6
思路
求取路徑總數的題目,一般可以通過遞歸求解,對於複雜的問題,可以通過動態規劃求解。
遞歸代碼
#include<iostream>
using namespace std;
int pathNum(int n, int m)
{
if (n > 1 && m > 1)
//遞歸
return pathNum(n - 1, m) + pathNum(n, m - 1);
else if (((n >= 1) && (m == 1)) || ((n == 1) && (m >= 1)))
//終止條件
return n + m;
else
//格子爲0時, 路徑爲0
return 0;
}
int main() {
int n, m;
while (cin >> n >> m)
{
cout << pathNum(n, m) << endl;
}
return 0;
}
動歸代碼
#include <vector>
using namespace std;
int main() {
vector<vector<int>> vv;
int n, m;
cin >> n >> m;
vv.resize(m+1);
for (auto& a : vv) {
a.resize(n+1, 1);
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
vv[i][j] = vv[i - 1][j] + vv[i][j - 1];
}
}
cout << vv[m][n] << endl;
return 0;
}
代碼生成圖:
如有不同見解,歡迎留言討論~~