描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围:1≤n,m≤8
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
示例1
输入:
2 2
输出:
6
递归实现(Python):
#坐标为(a,b)的坐标点只能从左边的(a-1,b)和上边的(a,b-1)到达 #于是直接递归即可,注意递归出口为行或者列数为1的时候 def f(a,b): if a==1 or b==1: return 1 else: return f(a-1,b)+f(a,b-1) str1=input().split() n=int(str1[0]) m=int(str1[1]) print(f(n+1,m+1))#n和m是格子数,行数列数比格子数大1动态规划实现(C++):
//主题:
//思路:坐标为(a,b)的坐标点只能从左边的(a-1,b)和上边的(a,b-1)到达
//得到状态转移方程,f(a,b)=f(a-1,b)+f(a,b-1)
#include<bits/stdc++.h>
using namespace std;
int dp[10][10];
int main(){
int n,m;
cin>>n>>m;
//第一行全1
for(int i=1;i<=n+1;i++){
dp[i][1]=1;
}
//第一列全1
for(int i=1;i<=m+1;i++){
dp[1][i]=1;
}
//开始打表
for(int i=2;i<=n+1;i++){
for(int j=2;j<=m+1;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
//cout<<dp[i][j]<<" ";
}
//cout<<endl;
}
cout<<dp[n+1][m+1];
return 0;
}

京公网安备 11010502036488号