描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围:1≤n,m≤8
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
示例1
输入:2 2
输出:6
思路为:
一个格子时,从格子的左上角抵达右下角,可以有两条路线,
当有一行两列共两个格子时,可以从前面一个格子右下角过来,也可以有新路线,从前一个格子右上角过来。共2+1=3条
有两行一列共两个格子时,可以从上面格子右下角过来,也可以走新路线,从前面格子左下角过来。共2+1=3条
当有2行2列格子时,可以从(1,2)格子右下角过来,也可以从(2,1)格子右下角过来,共3+3=6条。
可以发现dp[n][m]=dp[n-1][m]+dp[n][m-1],而且当n=0或者m=0时,dp[n][m]=1;
#include <stdio.h>
int main() {
int n,m;
scanf("%d %d",&n,&m);
int dp[n+1][m+1];
int i,j;
for(i=0;i<n+1;i++)
{
dp[i][0]=1;
}
for(j=0;j<m+1;j++)
{
dp[0][j]=1;
}
for(i=1;i<n+1;i++)
{
for(j=1;j<m+1;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
printf("%d",dp[n][m]);
return 0;
}