201301 JAVA題目2-3級(用遞歸和排列組合)

題目描述

鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章