windy数

#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
LL f[12][10],dp[12],digit[13];
//f[i][j]表示第i位为j,且长度为i的windy数的个数
//d[i]表示长度为i的windy数的个数
LL cal(LL n)
{
    if(n<10) return n-1;
    int len=0,i,j;
    LL ans=0;
    while(n)
    {
        digit[++len]=n%10;
        n/=10;
    }
    for(i=1;i<len;++i) //累加长度为i的windy数
    ans+=dp[i];
    for(i=len; i; --i)
    {
        if(i==len)
        {
            for(j=1; j<digit[i]; ++j)
                ans+=f[i][j]; //i长度,第i位为j的windy数的个数
        }
        else
        {
            for(j=0; j<digit[i]; ++j)
            {
                if(abs(j-digit[i+1])>1)
                    ans+=f[i][j];
            }
        }
        if(i!=len&&abs(digit[i]-digit[i+1])<=1) break;
        //如果随便找到2个位置出现相差小于2的情况则跳出,前面的数都固定了。
    }
    return ans;
}
int main()
{
    LL A,B;
    int i,j,k;
    for(i=0; i<10; ++i)
        f[1][i]=1;
    for(i=2; i<11; ++i)
        for(j=0; j<10; ++j)
            for(k=0; k<10; ++k)
                if(abs(j-k)>1)
                    f[i][j]+=f[i-1][k];
    for(i=1;i<=10;++i)
    for(j=1;j<10;++j)
    dp[i]+=f[i][j];
    while(cin>>A>>B)
    {
        cout<<cal(B+1)-cal(A)<<endl;
    }
}

 

posted @ 2013-03-28 21:21  小仪在努力~  阅读(184)  评论(0)    收藏  举报