USACO Section 2.2 Runaround Numbers - 又一个枚举的思想

来源:互联网 发布:java 正则表达式 * 编辑:程序博客网 时间:2024/05/22 07:52

     题目说的这种数长度最多为9,每位都不重复..并且没有0..所以如果事先枚举所有这些数再判断的话需要枚举的个数是9!=362880...才30多W~~果断先枚举出可能的所有情况~~就按题目要求的判断下~~枚举的同时就能保证是有序的~~所以后来的查找输出就从1开始找到第一个大于输入的数就ok了...

Program:

/*  ID: zzyzzy12  LANG: C++  TASK: runround*/    #include<iostream>    #include<stdio.h>    #include<string.h>    #include<math.h>    #include<algorithm>    #include<queue>using namespace std;     long long n,ans[1000001];int num,s[10],p;bool used[10],f[10]; bool ok(){     int i=1,k,j,num=p;      memset(f,0,sizeof(f));     while (num--)     {             k=i;              for (j=1;j<=s[i];j++)            {                  k++;                  if (k==p+1) k=1;                }             if (f[k]) return false;            f[k]=true;            i=k;     }      return true;}void search(int n){     int i;     if (n==p+1)     {            if (ok())            {                 ans[++num]=0;                 for (i=1;i<=p;i++) ans[num]=ans[num]*10+s[i];           }           return;                    }     for (i=1;i<=9;i++)      if (!used[i])     {           used[i]=true;           s[n]=i;           search(n+1);           used[i]=false;           }         return;      }int main(){     freopen("runround.in","r",stdin);     freopen("runround.out","w",stdout);          num=0;     for (p=1;p<=9;p++)     {           memset(used,false,sizeof(used));             search(1);     }      cin>>n;      int i;     for (i=1;i<=n;i++)         if (ans[i]>n) break;       cout<<ans[i]<<endl;     return 0;   }


原创粉丝点击