usaco Runaround Numbers

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

要求找出第一个比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;
}

  

时间: 2024-10-09 20:58:11

usaco Runaround Numbers的相关文章

USACO Runaround Numbers 模拟

根据题意的 Runaround 规则去找比当前数大的最近的一个 Runaround数字 模拟题~ Source code: /* ID: wushuai2 PROG: runround LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream>

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

USACO runaround

/* ID:kevin_s1 PROG:runround LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib&g

USACO Section2.2 Runaround Numbers 解题报告 【icedream61】

runround解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你一个数M,找出第一个比它大的循环数. 循环数:不包括0.没有重复数字,并且有循环性质的正整数. 循环性质:以81362为例 1.找到最高位,是8,那么往下数8位,依次是1,3

【USACO 2.2】Runaround Numbers

找出第一个大于n的数满足:每一位上的数都不同,且没有0,第一位开始每次前进当前这位上的数那么多位,超过总位数就回到开头继续往前进,最后能不能每个位都到过一次且回到第一位,$n<10^9$. 暴力,每次n++后模拟一边判断是否符合条件. /* TASK:runround LANG:C++ */ #include<cstdio> #include<cstring> using namespace std; int n; int get(int now,int step,int l

洛谷 P1467 [USACO2.2]循环数 Runaround Numbers

题目描述 循环数是那些不包括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

USACO Humble Numbers

这道题的意思是给你一个素数的集合, 定义丑数为集合中的数相乘, 问你第N个丑数是多少?假设我们现在已经得到了n个丑数, 要寻找地n+1个丑数的话就用当前的素数乘以之前得到的丑数之后找出大于最后一个丑数的最小值即可,代码如下: /* ID: m1500293 LANG: C++ PROG: humble */ #include <cstdio> #include <cstring> #include <algorithm> #include <queue> s

2.2.3 RUNAROUND NUMBERS 循环数

PS:最近工作比较忙,所以把以前在学校做acm的时候写的一些解题报告发出来 http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2327 题目大意:(如题) 输入输出:(如题) 解题思路:从开始数后一个数往后枚举,然后判断其是不是循环数,如果是就输出退出. void transfer() //转换函数,将整数的每一位数提取出来 { int i; n=0; while(tmp>0) { i=tmp%10; tmp/=10; tmpstr[n]=i;

2.2.3 Runaround Numbers

没什么好说的强行搜索.具体细节看代码. 代码如下: /* ID: awsd1231 PROG: runround LANG: C++ */ #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; unsigned long M; bool check(unsigned long x) { char buf[10]; sprintf(