題目描述
鏈接:https://www.nowcoder.com/questionTerminal/e2a22f0305eb4f2f9846e7d644dba09b
請編寫一個函數(允許增加子函數),計算n×m個的棋盤格子(正爲橫向的格子數,米爲豎向的格子數)沿着各自邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即:只能往右和往下走,不能往左和往上走。
輸入描述
輸入倆個正整數
輸出描述
輸出結果
示例1
輸入
2
2
輸出
6
解題思路1:
使用遞歸的思想,將(0, 0)作爲終點,將(m, n)作爲起點,然後從起點一直遞歸走。
首先,向右走一步爲(m , n-1)然後向下走爲(m-1, n),最終無論 m 和 n 誰爲0了,那麼就只有棋盤邊緣一條路可以走了。這也是遞歸的終止條件。
解題代碼:
#include <iostream>
using namespace std;
int Count(int m, int n) {
if (m == 0 || n == 0) {
return 1;
}
return Count(m, n - 1) + Count(m - 1, n);
}
int main() {
int m, n;
cin >> m >> n;
cout << func(m, n) << endl;
return 0;
解題思路2:
這個題目是典型的概率論 C 排列問題。每次要到達終點始終會走 m 行,n 列,所以這個排列組合是對順序沒有要求的 C 排列問題,也就是 C(m, m+n) 問題。
解題代碼:
#include <iostream>
using namespace std;
int main(){
int m, n;
cin >> m >> n;
int C_up = 1;
int C_down = 1;
for (int i = 0; i<n; i++){
C_up *= (m + n) - i;
C_down *= i + 1;
}
cout << C_up / C_down << endl;
return 0;
}