m * n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10^9 + 7的結果。
input
第1行,2個數m,n,中間用空格隔開。(2 <= m,n <= 1000)
output
輸出走法的數量。
input示例
2 3
output示例
3這個題目可以遞迴來求解,首先,我們需要乙個·遞推公式
對於矩陣中的格仔(i,j),假設cong(1,1)到它的路徑數量為path(i,j)
那麼,有:path(i,j)=path(i-1,j)+path(i,j-1)
很好理解,機械人只能向下或者向右運動,因此它只能是從(i-1,j)或者(i,j-1)
運動到(i,j)的,所以路徑數量也就是到達這兩個格仔的路徑之和
我們需要乙個初始條件,當僅有一行或者一列時,無論怎麼走也只有一條路
1ll path(llm lln)
完整**如下:
1 #include 2 #include 3 #include4 #include 5
const
int max = 1010;6
const
int mod = 1000000007;7
using
namespace
std;
8long
long
dp[max][max];
9int
main()
1023 }
第二種解法
從純數學角度,本人覺得反而更好理解,簡單的排列組合,機械人
從(1,1)走到(m,n)一定要向下走m-1次,向右走n-1次,因此,一共可能的
路徑數量就是從總的步數(m-1+n-1)裡取(m-1)步
c(m-1+n-1,m-1)=(m-1+n-1)!/((m-1)!*(n-1)!) //翻數學公式
1ll fact (ll n )
5ll path(llm ,lln)
變題:如果有一些格仔,機械人不能踏上去(放了地雷xd),那麼
我們如何輸出它所有的可能路徑
讓我們考慮簡單一點的問題,如果我們只要輸出它其中的一條可行
的路徑,那麼我們可以從終點(m,n)開始回溯,遇到可走的格仔
就入棧,如果沒有格仔能到達當前格仔,當前格仔則出棧,最後到達
(1,1)時,棧中正好儲存了一條可行的路徑
1bool get_path(int m,int
n)
其中二維陣列g表示的是m*n的矩陣,元素為1表示該位置可以走
為0表示該位置不可以走,這個只能得到其中的一條可行的路徑
但是題目要求我們找到所有可行路徑,並輸出。這樣的話,又該
怎麼辦呢?我們從(1,1)開始,如果某個格仔可以走,我們就將
它儲存到路徑陣列中,如果不能走,則回溯到上乙個格仔,繼續
選擇向右或者向下走,當機械人走到右下角的格仔(m,n)時,即
可輸出一條路徑,然後程式退出遞迴,回到上乙個格仔,找尋下
一條可行路徑
1void print_paths(int m,int n,int m,int n,int
len)
10else
14 }
程式使用的輸入樣例8.2.in如下:
3 41 1 1 0
0 1 1 1
1 1 1 1
輸出路徑如下:
one of tne paths:
(1,1) (1,2) (1,3) (2,3) (2,4) (3,4)
all paths:
(1,1) (1,2) (1,3) (2,3) (2,4) (3,4)
(1,1) (1,2) (1,3) (2,3) (3,3) (3,4)
(1,1) (1,2) (2,2) (2,3) (2,4) (3,4)
(1,1) (1,2) (2,2) (2,3) (3,3) (3,4)
(1,1) (1,2) (2,2) (3,2) (3,3) (3,4)
完整**如下:
1 #include 2 #include 3 #include 4using
namespace
std;
5 typedef long
long
ll;6 typedef struct
pointpoint;
9 stacksp;
10const
int maxn=20;11
intg[maxn][maxn];
12 point vp[maxn+maxn];
1314
ll path(llm,lln)
1819
ll path1(llm lln)
22bool get_path(int m,int
n)34
void print_paths(int m,int n,int m,int n,int
len)
43else47}
48int
main()
68 cout<"
all paths:
"<69 print_paths(1,1,m,n,0
);70
fclose(stdin);
71return0;
7273 }
51nod 1118 機械人走方格
m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。第1行,2個數m,n,中間用空格隔開。2 m,n 1000 輸出走法的數量。2 3第一次看到覺得用搜尋寫,沒寫出來,但是還是覺得搜素可以實現的 下面用的是dp,等...
51nod 1118 機械人走方格
基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。input 第1行,2個數m,n,中間用空格隔開。2 m,n 1000 output ...
51nod 1118 機械人走方格
1118 機械人走方格 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏關注m n的方格,乙個機械人從左上走到右下,只能向右或向下走。有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10 9 7的結果。input 第1行,2個數m,n,中間用空格隔開。2 ...