您的位置:首页 > 其它

USACO 2.2.3 Runaround Numbers(枚举+模拟)

2014-04-16 21:19 435 查看
题意:给你一个数,你需要找出一个比它大的最小的数,满足题目的循环条件,且各个数位值不同

思路:直接暴力枚举,时间复杂度O(N)

#include <stdio.h>
#include <stdlib.h>

int mal;

int check(long m)
{
int a[10];
memset(a, 0, sizeof(a));
mal = 0;
while(m)
{
mal++;
if(m % 10 == 0)return 0;
a[m % 10] = 1;
m /= 10;
}
return 1;
}

int main()
{
freopen("runround.in", "r", stdin);
freopen("runround.out", "w", stdout);
int a[10], f[10];
long long i, j, k, m, len, flag, mm;
scanf("%lld", &m);
while(1)
{
m++;
if(!check(m)) continue;
len = 0;
memset(f, 0, sizeof(f));
mm = m;
while(mm)
{
len++;
a[mal - len + 1] = mm % 10;
mm /= 10;
}
j = len;
i = 1;
while(j)
{
k = (a[i] + i - 1) % len + 1;
if(f[a[k]])
break;
f[a[k]] = 1;
i = k;
j--;
}
if(j == 0)
{
printf("%lld\n", m);
break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: