USACO 2.2 Runaround Numbers

USACO 2.2 Runaround Numbers


生成所有长度小于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;
}



你可能感兴趣的:(USACO 2.2 Runaround Numbers)