zoukankan      html  css  js  c++  java
  • [Project Euler] 来做欧拉项目练习题吧: 题目015

                                           [Project Euler] 来做欧拉项目练习题吧: 题目015

                                                        周银辉

    问题描述

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

    How many routes are there through a 20×20 grid? 

    问题分析

    这个题需要一点点观察能力:

    观察2*2的方格,以左上角为起点,右下角为终点,形成的所有路径刚好可以构成一棵二叉树。

    (不走回头路,并且以经过的方格上的节点为树节点,其中方格左上角为根节点,叶子节点始终是方格右下角)。

    而路径条数也就是树的叶子节点个数。

    用Count[A]表示树A的叶子节点个数,Left,Right表示左右子树.那么Count[A] = Count[Left] + Count[Right]

    OK,问题就变得很简单了,一个递归算法就可以解决。

    此后的问题,就是优化递归算法(创建一个缓冲区),减少重复运算,否则速度是不可接受的。

    #include <stdio.h>
    #define SZ    21        //20*20, index from 0 to 20, so size is 21 
    #define END (SZ-1)
    long long grid[SZ][SZ];
    long long test(int i, int j)
    {
    int record = grid[i][j];
    if(record!=0)
    {
    return record;
    }
    if(i==END && j==END)
    {
    return 1;
    }
    long long left=0, right=0, total=0;
    int  ni=i+1, nj=j+1; //ni: next i
    if(ni<SZ)
    {
    left = test(ni, j);
    grid[ni][j] = left;
    }
    if(nj<SZ)
    {
    right = test(i, nj);
    grid[i][nj] = right;
    }
    total = left+right;
    grid[i][j] = total;
    return total;
    }
    int main()
    {
    printf("path count: %lld\n", test(0,0));
    return 0;
    }

    速度挺快的:

    real    0m0.004s

    user    0m0.001s

    sys     0m0.003s 

  • 相关阅读:
    No module named _tkinter
    Camera2与TextureView使用
    Collections常用方法总结
    Android插件化框架
    《战狼2》观后感——民族荣耀
    《茶马古道》观后感——朝圣之路
    点击查看大图Activity
    图片压缩代码
    《天那边》观后感——对一些现象的反思
    recyclerView的使用
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/1963358.html
Copyright © 2011-2022 走看看