http://poj.org/problem?id=1942

题意 :在一个n*m的矩形上有n*m个网格,从左下角的网格划到右上角的网格,沿着边画,只能向上或向右走,问有多少条不重复的路 。

思路 :这种问题记得高中的时候就做过,学组合数的时候讲的,反正就是向上向右走,加起来要走的路必定为n+m条,选择n条向上,必定剩下的m为向右的,所以这个题就转化求C(n,m+n),或者是C(m,m+n),不过个人建议用m,n中小的那个数去做,因为省时。因为这个数据较大,所以求组合的时候就要注意以防超时,如果还像1850那样用杨辉三角就容易超时了,就要用另一种方法去求组合数,我以前整理过4种求组合数的方法,正好第四种这里可以用,拆分相除,逐项相乘。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <iomanip>

using namespace std ;

double com(unsigned n,unsigned m)
{
    unsigned a = m+n ;
    unsigned b = min(m,n) ;
    double comm = 1.0 ;
    while(b > 0)
    comm *= (double)(a--)/(double)(b--) ;
    return comm ;
}

int main()
{
    unsigned m,n ;
    while(scanf("%d %d",&m,&n)&&(m||n))
    {
        cout<<fixed<<setprecision(0)<<com(n,m)<<endl ;
    }
    return 0 ;
}
View Code

 

posted on 2013-11-22 20:03  枫、  阅读(175)  评论(0编辑  收藏  举报