1. 程式人生 > >c++計算排列組合數C(m,r),解決走方格問題

c++計算排列組合數C(m,r),解決走方格問題

計算組合數C(m,r)=m!/(r!*(m-r)),其中m,r均為正整數,且m>r。

程式碼如下:

#include<iostream>
using namespace std;

long factorial(long number)
{	if(number<=1)
		return 1;
	else 
		return number*factorial(number-1);
}

int combinator(int n,int m)
{	int temp;
	if(n<m)
	{	temp=n;
		n=m;
		m=temp;}
	return factorial(n)/(factorial(m)*factorial(n-m));
}
		
int main()
{	int a,b,result;
	cout<<"please enter two positive integer separated by spaces:";
	cin>>a>>b;
	result=combinator(a,b);
	cout<<result<<endl;
	return 0;
}

        問題示例:走方格的問題,假設有n*m的方格,從最左下角的方格開始,走到最右上角的方格結束,每次只能走一格(只能往上或者往右走),請問有多少種走法?網易的筆試題出過類似的題目。

       思路:顯然,不管怎麼走,都要往上走n-1步,往右走m-1步,才能到達終點,即總共要走n-1+m-1步。那麼有多少種走法?

從往上走的角度考慮的話,只需考慮總步數n-1+m-1中選擇n-1步的組合情況,剩下的往右的情況便確定下來,因此總的組合數為C(n-1+m-1,n-1)=(n-1+ m-1)!/ [(n-1)! *(m-1)!]。考慮往右走的話,思路和結果是一樣的。

      以上是從數學排列組合的角度思考比較好理解,如果方格數較小,只要手算即可!

例:   1、正方形的格子總步數為1,組合數為1

           2、田字格總步數為2,情況為C(2,1)= 2

           3、九宮格總步數為4,情況為C(4,2)= 6

           4、16宮格總步數為6,情況為C(6,3)= 20

       不過當數字較大,且要求用程式設計解決,可以考慮寫出組合數的程式,代入即可!

當然還有其他的程式設計思路,將矩陣方格看成一個矩陣N*M,(i=1.....N,j=1........M),座標為(i,j)必然是由座標(i-1,j)或者(i,j-1)得到,因此通過遞迴求出(1,1)到達(N,M)的走法。