首页 > 其他 > 详细

usaco Runaround Numbers

时间:2015-09-03 23:03:40      阅读:286      评论:0      收藏:0      [点我收藏+]

 题意为一个数从最左边开始,往右数这个位上的个数个,然后这样走一圈,回到起点,每个数字都访问过且只访问一次,这个数字就是循环数

 要求找出第一个比N大的循环数

/*
ID: modengd1
PROG: runround
LANG: C++
*/

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <memory.h>
using namespace std;
bool isarroud(int x)
{
    int A[20];
    int Size=0;
    bool vis[10];
    memset(vis,false,sizeof(vis));
    for(Size=0;x>0;Size++)
    {
        A[Size+1]=x%10;
        if(A[Size+1]==0)
            return false;
        if(vis[A[Size+1]])
            return false;
        vis[A[Size+1]]=true;
        x/=10;
    }
    int tag=0,i;
    //因为A数组中存储方向的关系,i表示的是从左往右数第几位数,但第i位数字在数组中的A[Size]位置
    for(i=0;!(tag&1<<i);i=(i+A[Size-i])%Size)
        tag|=1<<i;
    if(tag==(1<<Size)-1&&i==0)
        return true;
    return false;
}
int main()
{
    freopen("runround.in","r",stdin);
    freopen("runround.out","w",stdout);
    int N;
    scanf("%d",&N);
    while(N++)
    {
        if(isarroud(N))
            break;
    }
    cout<<N<<endl;
    return 0;
}

  

usaco Runaround Numbers

原文:http://www.cnblogs.com/modengdubai/p/4780799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!