Simple Path Count Problem

The Problem: given a grid of size (M+1)x(N+1),

  A(0,0)+--+--+--+--+--+--+ (0,6) N=6
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+
        |  |  |  |  |  |  |
        +--+--+--+--+--+--+ B(9,6)
	M = 9  (9,0)

   the question is how to get the number of shortest paths from point A (0,0)
   to point B (M,N). A shortest path from A to B consists of only edges of 
   left to right, or up to down, i.e. with length M+N.
   

A very straightforward program will use recursive call:

			
    //row: 0..M
    //col: 0..N	
    //pathcount returns the number of shortest paths from (0,0) to (row, col)
    int pathcount(int row, int col) 
    {
        if (row==0 && col==0)
            return 0;
        else if (row==0)
            return 1;
        else if (col==0)
            return 1;
        else
          return pathcount(row-1,col)+pathcount(row,col-1);
     }
	 
		

A more elaborated implementation will do the calculation in a bottom up way:

			
    template < size_t M, size_t N>
    int pathcount()
    {   
      int i, j;
      int pc[M+1][N+1];
      pc[0][0] = 0;
      for(i=1; i <= N; i++)
        pc[0][i]=1;
      for(i=1; i <= M; i++)
        pc[i][0]=1;
      for(i=1; i <= M; i++) //rows
        for(int j=i; j <= N; j++) //cols
        {
           pc[i][j] = pc[i-1][j]+pc[i][j-1];
           if ( j <= M ) // note that i <= N
              pc[j][i] = pc[i][j];
        }
      return pc[M][N];
     }
			
		

This implementation actually calculates the number of shortest paths from (0,0) to any (i,j) where i<=M and j<=N. Therefore, pc[M][N] will be the number of shortest paths from (0,0) to (M,N).