这是一个很有趣的题,可以用很多巧妙的方法解,当然也少不了数学方法.
   

Problem 15</h2>
19 April 2002</div>

Starting in the top left corner of a 2×2 grid, there are 6 routes (without backtracking) to the bottom right corner.</p>

</div>

How many routes are there through a 20×20 grid?</p>


</p>

  1. 初看起来似乎没什么感觉,但总结下,只是每个路径都必须有40条线,且有20条竖线和20条横线。</p>

   组合数学告诉我们 answer:C(40,20)
</p>

  2. 递归调用,若每个节点,用坐标表示的话,routes(m,n)表示(0,0)到(m,n)的路线数,注意到routes(m,n)包括了经过, (m-1,n-1), (m,n-2),(m-2,n)的三种路径,而他们却不会重合。这就直接找出了 routes(m,n)的递推关系式,所以:</p>

[code]
</p>

#include
long long int routes(int m,int n)
{
    if(m==1)
        return n+1;
    else if(n==1)
        return m+1;
    else if(m==0||n==0)
        return 1;
    else
        return 2*routes(m-1,n-1)+routes(m,n-2)+routes(m-2,n);
}
int main()
{
    long long int  count=0;
    count=routes(20,20);
    printf("%lldn",count);
    return 0;
}</p>

[/code]</p>

用了 1.597274065017700195312500000000s才跑出结果,不过很方便理解。</p>

3.还好,有projecteuler优秀前辈的算法,现在列上几个好的C/C++ code:</p>


</p>


</p>

My solution uses a top down approach. For example for 1x1 grid, we can reach the corner from its neighboring nodes in 1 way. 2----1 | | 1----0 So to reach it from the top left corner we have 2 ways. now suppose a 2x1 grid 3----1 | | 2----1 | | 1----0 We can reach the bottom right corner, from the top left corner, by either taking the "down" route which has 2 ways, or the "right" way which has 1 way. So for any NxM grid construct a N+1 x M+1 matrix. Mark matrix[N]=1 matrix</i>[M]=1 Assuming indexing starts from 0. The values for the rest of the cells can be evaluated by: matrix</i>[j]=matrix[i+1][j] + matrix</i>[j+1] where i=N-1 to 0 and j=M-1 to 0.</i></div></td></tr></tbody></table>

</i></i></i></i>

#include</span></span> </span>#define</span> XMAX </span>21</span> </span>#define</span> YMAX </span>21</span> </span>int</span> main</span>()</span> </span>{</span> </span>long</span> </span>long</span> </span>int</span> matrix</span>[</span>XMAX</span>][</span>YMAX</span>];</span> </span>int</span> i</span>,</span>j</span>;</span> </span>for</span>(</span>i</span>=</span>0</span>;</span>i</span><=</span>XMAX</span>-</span>1</span>;</span>i</span>++)</span> </span>{</span>     matrix</span>[</span>XMAX</span>-</span>1</span>][</span>i</span>]=</span>1</span>;</span>     matrix</span>[</span>i</span>][</span>YMAX</span>-</span>1</span>]=</span>1</span>;</span> </span>}</span> </span>for</span>(</span>i</span>=</span>XMAX</span>-</span>2</span>;</span>i</span>>=</span>0</span>;</span>i</span>--)</span> </span>for</span>(</span>j</span>=</span>YMAX</span>-</span>2</span>;</span>j</span>>=</span>0</span>;</span>j</span>--)</span>       matrix</span>[</span>i</span>][</span>j</span>]=</span>matrix</span>[</span>i</span>+</span>1</span>][</span>j</span>]+</span>matrix</span>[</span>i</span>][</span>j</span>+</span>1</span>];</span>   printf</span>(</span>"%lld"</span>,</span>matrix</span>[</span>0</span>][</span>0</span>]);</span> </span>}</span></pre></p>

   这个用了  0.000071048736572265625s,超级快,算法也牛!</p>


</p>

下面的也不错,都是数组的方法。
</p>

It got 0.047S to Reply the answer C For ever
C/C++</div></td>
Hide Code</div></td></tr></tbody></table></div>
#include</span> </span></span> </span>#include</span> </span></span> </span>int</span> main</span>()</span> </span>{</span> </span>long</span> </span>long</span> n</span>=</span>20</span>,</span>m</span>=</span>20</span>,</span>i</span>[</span>n</span>],</span>x</span>,</span>a</span>,</span>j</span>[</span>m</span>],</span>sum</span>=</span>0</span>;</span> </span>for</span>(</span>n</span>=</span>1</span>;</span>n</span><=</span>20</span>;</span>n</span>++)</span> </span>{</span>         i</span>[</span>n</span>]=</span>1</span>;</span> </span>}</span> </span>for</span>(</span>x</span>=</span>1</span>;</span>x</span><=</span>19</span>;</span>x</span>++)</span> </span>{</span> </span>for</span>(</span>m</span>=</span>1</span>;</span>m</span><=</span>20</span>;</span>m</span>++)</span> </span>{</span>             j</span>[</span>m</span>]=</span>0</span>;</span> </span>}</span>         m</span>=</span>1</span>;</span> </span>for</span>(</span>n</span>=</span>1</span>;</span>n</span><=</span>20</span>;</span>n</span>++)</span> </span>{</span>             sum</span>+=</span>i</span>[</span>n</span>];</span> </span>}</span> </span>for</span>(</span>a</span>=</span>1</span>;</span>a</span><=</span>20</span>;</span>a</span>++)</span> </span>{</span> </span>for</span>(</span>n</span>=</span>1</span>;</span>n</span><=</span>a</span>;</span>n</span>++)</span> </span>{</span>                 j</span>[</span>m</span>]+=</span>i</span>[</span>n</span>];</span> </span>}</span>             m</span>+=</span>1</span>;</span> </span>}</span>         n</span>=</span>1</span>;</span> </span>for</span>(</span>m</span>=</span>1</span>;</span>m</span><=</span>20</span>;</span>m</span>++)</span> </span>{</span>             i</span>[</span>n</span>]=</span>j</span>[</span>m</span>];</span>             n</span>+=</span>1</span>;</span> </span>}</span> </span>}</span>     printf</span>(</span>"%lld"</span>,(</span>sum</span>+</span>1</span>)*</span>2</span>);</span> </span>return</span> </span>0</span>;</span> </span>}
</span></pre></div></div></td></tr></tbody></table> </div></div>