runround

#include<cstdio>
#include<cstring>
using namespace std;
char s[10];
int used[10];
char shuru[10];
int check(char s[])
{
    int len=strlen(s);
    int vis[10]={0};
    vis[0]=1;
    int temp=0;
    for(int i=1;i<len;i++)
    {
        temp=(temp+s[temp]-‘0‘)%len;
        if(vis[temp]) return 0;
        vis[temp]=1;
    }
    if((temp+s[temp]-‘0‘)%len==0) return 1;
    return 0;
}
int ju(char s[],char shuru[])
{
    int len1=strlen(s);
    int len2=strlen(shuru);
    if(len1>len2) return 1;
    if(len1<len2) return 0;
    for(int i=0;i<len1;i++)
    {
        if(s[i]>shuru[i]) return 1;
        if(s[i]<shuru[i]) return 0;
    }
    return 0;
}
int work(char s[],int cur,int fin)
{
    if(cur==fin)
    {
        s[fin]=0;
        if(ju(s,shuru)&&check(s))
        {
            printf("%s\n",s);
            return 1;
        }
        return 0;
    }
    for(int i=1;i<=9;i++)
    {
        if(!used[i])
        {
            s[cur]=i+‘0‘;
            used[i]=1;
            if(work(s,cur+1,fin)) return 1;
            used[i]=0;
        }
    }
    return 0;
}
int main()
{
    freopen("runround.in","r",stdin);
    freopen("runround.out","w",stdout);
    memset(used,0,sizeof(used));
    scanf("%s",shuru);
    for(int i=1;i<=9;i++)
    {
        if(work(s,0,i)) break;
    }
    return 0;
}

迭代生成排列

时间: 2024-12-23 18:42:01

runround的相关文章

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 isarro

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

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

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 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

Section 2.2

Preface Numbering 罗马数字的处理,问从1-N,各个IVX...什么的出现了多少次. 我们可以用IVX表示出1-9 XLC表示出10-90 CDM表示出100-900 统计出怎么出现的.接下来从高位往下减来表示就好了. #include <bits/stdc++.h> using namespace std; char dir[10] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'}; int cnt[10][3]; int ans[10]; void

【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

实验三 进程模拟调度程序

1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等

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(

USACO--2.2Runaround Numbers

开始的时候认为数据太大,直接模拟会超时,但其实还是可以直接模拟的,原因在于这种Runaround Numbers分布还比较稠密.另外要注意读题. 代码如下: /* ID:15674811 LANG:C++ PROG:runround */ #include<iostream> #include<cstdio> #include<cstring> #include<fstream> using namespace std; int conut(int *vis