[每日一題]57:走格子

題目描述

請編寫一個函數(允許增加子函數),計算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;
}

代碼生成圖:
在這裏插入圖片描述


如有不同見解,歡迎留言討論~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章