生成所有长度小于9的排列数,然后判断是否为runaround数且大于m,输出第一个大于m的直接exit即可。
因为9! = 362880,数据较小,不会超时。
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("runround.in");
ofstream fout("runround.out");
#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif
int m;
bool mark[10];
int figures[10];
void solve();
void permutation(int max_dep);
unsigned long get_value(int len);
bool isok(int len);
int main(int argc,char *argv[])
{
solve();
return 0;
}
void solve()
{
in>>m;
int start = 0;
int tmp = m;
while(tmp){
tmp/=10;
start++;
}
for(int i=start;i<=9;++i){
permutation(i);
}
}
void _permutation(int depth,int max_dep)
{
if(depth==max_dep){
if(isok(max_dep)){
/* for(int i=0;i<max_dep;++i)
cout<<figures[i]<<' ';
cout<<endl;
*/ unsigned long t = get_value(max_dep);
if(t>m){
out<<t<<endl;
exit(0);
}
}
return;
}
for(int i=1;i<=9;++i){
if(!mark[i]){
mark[i] = true;
figures[depth] = i;
_permutation(depth+1,max_dep);
mark[i] = false;
}
}
}
//生成长度为len的全排列
void permutation(int len)
{
memset(mark,0,sizeof(mark));
_permutation(0,len);
}
//是runaround数
bool isok(int len)
{
int unvisited = len;
bool mark[10];
memset(mark,0,sizeof(mark));
int i = 0;
while(unvisited--){
i+=figures[i]; i%=(len);
if(mark[i]) return false;
mark[i] = true;
}
return true;
}
//将数组转化成unsigned long
unsigned long get_value(int len)
{
unsigned long res = 0;
for(int i=0;i<len;++i){
res*=10;
res+=figures[i];
}
return res;
}