生成所有長度小于9的排列數(shù),然后判斷是否為runaround數(shù)且大于m,輸出第一個(gè)大于m的直接exit即可。
因?yàn)?! = 362880,數(shù)據(jù)較小,不會(huì)超時(shí)。
#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數(shù)
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;
}
//將數(shù)組轉(zhuǎn)化成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;
}