#请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,
#总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。 #递归做法
def f(n,m):#从左上角到右下角,每次有两种走法,即右移一布或下移一布;当走到边界,即坐标点其中一个等于0,则只有一种走法
if n==0 or m==0:
return 1
else:
return f(n-1,m)+f(n,m-1)
while True:
try:
n,m=map(int,input().split())
print(f(n,m))#老是把python3的括号忘了,囧
except:
break
//递归做法 #include <iostream>
using namespace std;
int f(int n,int m){
int res;
if(n==0 || m==0)
res=1;
else
res=f(n-1,m)+f(n,m-1);
return res;
}
int main(){
int n,m;
while(cin >> n >> m){
int path_num=f(n,m);
cout << path_num <<endl;
}
}
//动态规划
#include <iostream>
#include <vector>
using namespace std;
int main(){
int m,n;
while(cin >> m >> n){
vector<vector<int>> res(n+1,vector<int>(m+1,0));
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(i==0&&j==0){
res[i][j]=1;
continue;
}
if(i==0){
res[i][j]=res[i][j-1];
}
else if(j==0){
res[i][j]=res[i-1][j];
}
else {
res[i][j]=res[i][j-1]+res[i-1][j];
}
}
}
cout << res[n][m] <<endl;
}
return 0;
} //从左上角向右下角走,总计要向右走n次,向下走m次,一共走m+n次。 //则本题可以归为一个排列组合问题,即在总计m+n次中选出m次向下走的,即 #include <iostream>
using namespace std;
int main(){
int m,n;
while(cin >> m >> n){
int up=1,down=1;
for(int i=0;i<n;i++){
up *=(m+n)-i;
down *=i+1;
}
cout << up/down <<endl;
}
}