USACO 2.2.3 循环数 Runaround Numbers

题解

比较简单的模拟,注意这个环的条件比较苛刻。
感觉自己写代码还是不够仔细,没有想清楚就动手,花了好多时间debug。


Code

#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;
int n,m;
int cot[15];

int vis[10];
int val[10];
int num_size=0;

void num2arr(unsigned long num){// turn num into array
    int pos = 0;
    while(num!=0){
        cot[pos++] = num%10;
        num/=10;
    }
    num_size = pos;
}

bool status(){ // detect whether current movement is valid
    for(int i=1;i<=9;i++)
        if( vis[i] >= 2)
            return false;

    return true;
}
bool Cyc(){// whether our track is a cycle

    if( vis[ cot[num_size-1]]!=2 ) return false;
    int sum=0,pro=1;
    for(int i=0;i<num_size;i++){
        sum+=vis[ cot[i] ];
        pro*=vis[ cot[i] ];
    }

    if( pro == 2 && sum ==  num_size+1 ) return true;
    else return false;
}

bool val_num(){// whether this num is valid : not 0s not duplicate
    memset(val,0,sizeof(val));
    for(int i=0;i<num_size;i++){
        val[cot[i]]++;
    }
    if(val[0] > 0) return false;
    for(int i=1;i<10;i++){
        if(val[i]>1) return false;
    }
    return true;
}

bool isCyc(){// imitate the movement

    int pos = num_size-1;

    while( status() ){
        vis[  cot[pos] ] ++;
        pos -= cot[pos];
        while(pos<0)
            pos +=num_size;
        pos %= num_size;
    }

    if(Cyc()) return true;

    return false;
}


int main(void){

    freopen("runround.out","w",stdout);
    freopen("runround.in","r",stdin);
    unsigned long nn;
    cin>>nn;
    nn++;
    num2arr(nn);
    while( !val_num() ||  !isCyc() ){
        nn++;
        num2arr(nn);
        memset(vis,0,sizeof(vis));
    }
    cout<<nn<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/smmyy022/article/details/81485540