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;
}



posted on 2009-06-20 22:35 YZY 阅读(1287) 评论(2)  编辑 收藏 引用 所属分类: AlgorithmUSACO

评论

# re: USACO 2.2 Runaround Numbers 2009-06-24 14:58 ChenZB

呃...初学C++一年,宏定义还不太会用...基本没用囧~~  回复  更多评论   

# re: USACO 2.2 Runaround Numbers 2009-06-24 15:05 止于自娱

@ChenZB
我这宏没啥用,方便调试而已.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜