移動路線
總時間限制: 1000ms 內存限制: 65536kB
描述
×桌子上有一個m行n列的方格矩陣,將每個方格用座標表示,行座標從下到上依次遞增,列座標從左至右依次遞增,左下角方格的座標爲(1,1),則右上角方格的座標爲(m,n)。
小明是個調皮的孩子,一天他捉來一隻螞蟻,不小心把螞蟻的右腳弄傷了,於是螞蟻只能向上或向右移動。小明把這隻螞蟻放在左下角的方格中,螞蟻從
左下角的方格中移動到右上角的方格中,每步移動一個方格。螞蟻始終在方格矩陣內移動,請計算出不同的移動路線的數目。
對於1行1列的方格矩陣,螞蟻原地移動,移動路線數爲1;對於1行2列(或2行1列)的方格矩陣,螞蟻只需一次向右(或向上)移動,移動路線數也爲1……對於一個2行3列的方格矩陣,如下圖所示:
|(2,1)|(2,2)|(2,3)|
-------------------
|(1,1)|(1,2)|(1,3)|
-------------------
螞蟻共有3種移動路線:
路線1:(1,1) → (1,2) → (1,3) → (2,3)
路線2:(1,1) → (1,2) → (2,2) → (2,3)
路線3:(1,1) → (2,1) → (2,2) → (2,3)
輸入
輸入只有一行,包括兩個整數m和n(0
2 3
樣例輸出
3
思路點拔:一個簡單的dp,大家想一想,這隻可憐的螞蟻只能想下或向右走,所以第一行的所有點是不是都只有一種走法,所以乾脆初始時就把所有的點都賦爲1,後面把它覆蓋掉就行了。
1 1 1
1 1 1
其他點都是左邊的走法加上上面的走法,學了小學奧數的應該都知道,這時,棋盤的狀態就是下面的樣子
1 1 1
1 2 3
這麼簡單的題我就不多說了,上代碼!!
#include<cstdio>
int main()
{
int m,n,a[25][25];
scanf("%d %d",&m,&n); //輸入棋盤大小
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
a[i][j]=1; //首先將棋盤清爲1
}
}
for(int i=2;i<=m;i++)
//循環就不必枚舉第一行與第一列了,因爲都是一種方法
{
for(int j=2;j<=n;j++)
{
a[i][j]=a[i-1][j]+a[i][j-1];
//每個點的走法都法、等於上面的點的走法加上左邊的點的走法
}
}
printf("%d\n",a[m][n]); //輸出終點的點的走法就是正解
return 0;//可以放心大膽的結束了
}