c++计算排列组合数C(m,r),解决走方格问题

计算组合数C(m,r)=m!/(r!*(m-r)!),其中m,r均为正整数,且m>r。

显然,需要先计算n的阶乘,对于n阶乘,其计算公式如下:

n! =\left\{\begin{matrix} 1 & (n=0,1)\\ n*(n-1)! & (n>1) \end{matrix}\right.

代码如下:

#include<iostream>
using namespace std;

//注意防止n太大,导致栈溢出
unsigned int fac(unsigned int n)
{	if(n<=1)
		return 1;
	else 
		return n*fac(n-1);
}

int combinator(int n,int m)
{	int temp;
	if(n<m)
	{	temp=n;
		n=m;
		m=temp;}
	return fac(n)/(fac(m)*fac(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)的走法。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值