Code

【题目描述】

给定一个n,表示一个由0~9数字构成的n位密码。

解锁时一直读入,只要当最后读入的n个数字与密码吻合,就解锁。

现需要输出一个长度为10n+n-1的数字序列,这个数字序列包括了n位密码的所有可能。

【输入描述】

输入若干行,每行一个整数n(0 <= n <= 6)。

【输出描述】

与输入相对应,每行输出一串数字序列。

【样例输入】

1

2

0

【样例输出】

0123456789

00102030405060708091121314151617181922324252627282933435363738394454647484955657585966768697787988990

听说是个欧拉回路裸题(不明觉厉):

源代码:

#include<cstdio>
#include<cstring>
const int Pow[7]={1,10,100,1000,10000,100000,1000000};
int n,Top,Num[1000001],Q[1000001];
bool Vis[1000001];
void DFS()
{
    for (int a=1;a<n;a++)
      putchar('0');
    memset(Vis,0,sizeof Vis);
    memset(Num,0,sizeof Num);
    Top=1;
    Vis[0]=true;
    Q[Top]=0;
    while (Top!=Pow[n])
    {
        int T1=Q[Top];
        if (Num[T1]==10)
        {
            Vis[T1]=Num[T1]=0;
            Top--;
            continue;
        }
        Num[T1]++;
        int T2=(T1*10+Num[T1]-1)%Pow[n];
        if (Vis[T2])
          continue;
        Vis[T2]=true;
        Q[++Top]=T2;
    }
    for (int a=1;a<=Top;a++)
      printf("%d",Q[a]%10);
}
int main()
{
    while(scanf("%d",&n))
    {
        if (!n)
          break;
        if (n==1)
          printf("0123456789");
        else
          DFS();
        putchar('
');
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5805285.html