因为每位的数字都是唯一的,所以先从1到9位回溯构造数字,然后判断是否runaround #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; ifstream fin("runround.in"); ofstream fout("runround.out"); int n,now; char num[10]; bool used[10]; int val[1000000]; int vi=0; bool check(){ bool read[10]; memset(read,false,sizeof(read)); int ri=0; read[ri]=true; int sta,end; sta=num[0]; while(1){ ri=(num[ri]-'0'+ri)%now; if(read[ri]){ end=num[ri]; break;} read[ri]=true; } if(sta!=end) return false; for(int i=0;i<now;i++){ if(!read[i]) return false; } return true; } void make(int dep){ if(dep==now){ if(check()){ int tmp=0; int wei=1; for(int i=now-1;i>=0;i--){ tmp+=(wei*(num[i]-'0')); wei*=10; } val[vi++]=tmp; } return ; } for(int i=1;i<10;i++){ if(!used[i]){ used[i]=true; num[dep]='0'+i; make(dep+1); used[i]=false; } } } int main(){ fin>>n; memset(used,false,sizeof(used)); for(now=1;now<10;now++){ memset(used,false,sizeof(used)); make(0); } for(int i=0;i<vi;i++){ if(n<val[i]){ fout<<val[i]<<endl;break;} } return 0; }