USACO 2.2.3 Runaround Numbers 循环数

来源:互联网 发布:vb中str是什么意思 编辑:程序博客网 时间:2024/05/17 23:54

Problem H: 2.2.3 Runaround Numbers 循环数

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 9  Solved: 5
[Submit][Status][Web Board]

Description

循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质, 就像这个例子: 如果你从最左边的数字开始 ( 在这个例子中是8) 数最左边这个数字个数字到右边(回到最左边如果数到了最右边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数). 就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6. 重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2. 再这样做 (这次数两个): 8 1 再一次 (这次一个): 3 又一次: 6 2 8 这是你回到了起点, 在从每一个数字开始数1次之后. 如果你在从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。 给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数, 并且一定能用一个无符号长整形数装下。

Input

仅仅一行, 包括M

Output

仅仅一行,包括第一个比M大的循环数。

Sample Input

81361

Sample Output

81362


解题思路:  模拟题
      将大整数用数组存起来。从n++开始循环
      1、数组中出现0,continue;
      2、数组中出现某两个数相等,continue;
      3、a[a[i]+i]==a[i],continue;
      4、数组中从任一个数开始都能循环到起点,并且将所有数遍历一遍。

代码:
/*
ID:ytjiang1
TASK:runround
LANG:C++
*/


#include <fstream>
#include <iostream>

using namespace std;

int a1[20],a2[20];
int visit[20];
long long n;
long long i,j;
int bool1,bool2,bool3,bool4;
int r,s,t,k,k1;

int main()
{
    ifstream fin("runround.in");
    ofstream fout("runround.out");
    fin>>n;
    while(n++)
    {
        i=n;
        t=1;
        j=100000000;
        bool3=0;
        while(j>0)
        {
            if(i/j<=0 && bool3==0)
            {
                j/=10;
                continue;
            }
            bool3=1;
            a1[t++]=i/j;
            i=i%j;
            j/=10;
        }

        bool1=1;
        for(r=1;r<t;r++)
        {
            if(a1[r]==0)
            {
                bool1=0;
                break;
            }
        }
        if(bool1==0)
            continue;

        for(r=1;r<t;r++)
        {
            for(s=r+1;s<t;s++)
            {
                if(a1[r]==a1[s])
                {
                    bool1=0;
                    break;
                }
            }
            if(bool1==0)
                break;
        }
        if(bool1==0)
            continue;
        for(r=1;r<t;r++)
        {
            k1=(a1[r]+r)%(t-1);
            if(k1==0)
                k1=t-1;
            if(a1[k1]==a1[r])
            {
                bool1=0;
                break;
            }
        }
        if(bool1==0)
            continue;
        //cout<<"bool1="<<bool1<<endl;

        for(r=1;r<t;r++)
        {
            for(s=1;s<t;s++)
                visit[s]=0;
            s=r;
            bool2=0;
            k1=(s+a1[s])%(t-1);
            if( (s+a1[s])%(t-1)==0)
                k1=t-1;

            while(visit[k1]==0)
            {
                if(k1==r)
                {
                    visit[k1]=1;
                    bool4=1;
                    for(k=1;k<t;k++)
                    {
                        if(visit[k]==0)
                        {
                            bool4=0;
                            break;
                        }
                    }
                    if(bool4==0)
                    break;
                    bool2=1;
                    break;
                }
                //cout<<"t="<<t<<"    (s+a1[s])%(t-1)=     "<<k1<<endl;
                //cout<<a1[k1]<<"   ";
                visit[k1]=1;
                s=k1;
                k1=(s+a1[s])%(t-1);

                if((s+a1[s])%(t-1)==0)
                    k1=t-1;
                //cout<<"s="<<s<<endl;
                //for(k=1;k<t;k++)
                //cout<<visit[k]<<" ";
            }
            //cout<<"bool2="<<bool2<<endl;
            if(bool2==0)
            {
                bool1=0;
                break;
            }
        }
        if(bool4==0)
            continue;
        if(bool1==0)
            continue;
//cout<<"hahaha..........."<<endl;
        if(bool1==1)
            fout<<n<<endl;
        break;
    }
    return 0;
}


原创粉丝点击