这又是我想吐槽难度差的一道题……也有可能是我想得太简单了……
大致上就是暴力穷举,每个数字检查两个条件:
1. 每位数字是否不重复
2. 能否满足runround的条件,也就是从第1位开始,向后移该位数字的位数,如果循环一圈之后发现每位数字都经过了,那么就满足条件
其中,唯一的关键点是检查runround。我的做法是,完全根据题意的逻辑顺序来,每次从第一位开始,依次向下移位,直到循环到了已经经过的位数,最后统一检查是否每个数字都经过了。
以下是代码:
#include <iostream>
#include <fstream>
using namespace std;
const int MAXD = 10;
int num[MAXD];
int nLen;
int M;
bool isRunround()
{
int checks[MAXD] = {0};
int i;
i = nLen - 1;
i = i - num[i] > 0 ? (i - num[i]) % nLen : nLen + (i - num[i]) % nLen;
while (checks[i] == 0) {
checks[i] = 1;
i = i - num[i] > 0 ? (i - num[i]) % nLen : nLen + (i - num[i]) % nLen;
}
for (i = 0; i < nLen; i ++)
if (checks[i] == 0)
return false;
return true;
}
bool isUnique()
{
int checks[MAXD] = {0};
int i;
for (i = 0; i < nLen; i ++) {
if (checks[num[i]] == 1 || num[i] == 0)
return false;
checks[num[i]] = 1;
}
return true;
}
void getNum(int n)
{
int i, m;
for (i = 0, m = n; m != 0; i ++, m /= 10)
num[i] = m % 10;
nLen = i;
}
int main()
{
ifstream fin ("runround.in");
ofstream fout ("runround.out");
int i;
fin >> M;
for (i = M+1; ; i ++) {
getNum(i);
if (isUnique() && isRunround())
break;
}
fout << i << endl;
}
闲话时间,我发现,暴力穷举什么的我真是越做越顺手了_(:з」∠)_