编程之美测试题目:踩方格

时间限制: 1000ms 内存限制: 1024MB

 

描述

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b.    走过的格子立即塌陷无法再走第二次;
c.    只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

输入

允许在方格上行走的步数n

输出

计算出的方案数量

 

对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100.

 

 

样例输入
2
样例输出
7
 
这个题目第一次看的时候没有仔细分析,马马虎虎使用递归写的代码 
 
#include <stdio.h>

#define UP 0
#define LEFT 1
#define RIGHT 2

int cal(int n,int fx){
    static int ax=0;
    int tax;
    if(n==0){
        ax++;
        return 0;
    }
    else{
        n--;
        switch(fx){
            case UP:{
                cal(n,UP);
                cal(n,LEFT);
                cal(n,RIGHT);
                break;
            }
            case LEFT:{
                cal(n,UP);
                cal(n,LEFT);
                break;
            }
            case RIGHT:{
                cal(n,UP);
                cal(n,RIGHT);
                break;
            }
        }
    }
    return ax;
}

int main(){
    int n;
    scanf("%d",&n);    
    printf("%d\n",cal(n,UP));
    return 0;
}

 

递归模拟看起来简单,但是效率低下,这个题目出的也够狠,以上算法在计算第二十一步的时候时间让人难以承受。

 
把步骤画在纸上,可以得到一个树,重新的发现了一个简单的规律
 
#include <stdio.h>

int main(){
    unsigned long int a=1,b=3,c=b;
    int num;
    scanf("%d",&num);
    while(--num){
        c=(b-a)*2+a*3;
        a=b;
        b=c;
    }    
    printf("%ld\n",c);
}

 

这个代码也是有问题,虽然可以快速的计算,但是unsigned long int依然是不够大,所以说还需要编写一个大数据计算的算法才行。

 
 
 
 
posted @ 2013-04-08 13:45  wrule  阅读(1097)  评论(0编辑  收藏  举报