标签:des style color os io for ar div
Description
Input
Output
Sample Input
1 2 0
Sample Output
0123456789 00102030405060708091121314151617181922324252627282933435363738394454647484955657585966768697787988990
题意:破解一套1-6位长度密码的系统,寻找这样一个序列:对于N位的密码10^N+N-1长度的连续的长为N的串能够枚举完所有的密码。
思路:做的头疼,懒得写了。就拿别人的题解吧:对于每一个长度为n的串,让该串的前n-1位为一个节点,后n-1位为另一个节点这样就确定了这个串。
n 位数有10n 种编码方案(即10n 组数),要使得一个数字序列包含这10n 组n 位数,且序列的长
度最短,唯一的可能是每组数出现一次且仅一次、且前一组数的后n-1 位是后一组数的前n-1 位,
这样10n 组数各取1 位,共10n 位,再加上最后一组数的后n-1 位,总位数是10n + n - 1。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 1000015;
struct Edge {
int v, next;
} e[maxn];
int n, mod, head[maxn], stk[maxn];
int idx, lim, edge, top;
char vis[maxn];
void insert(int a, int b) {
e[idx].v = b;
e[idx].next = head[a];
head[a] = idx++;
}
void dfs() {
stk[top++] = 0;
while (1) {
int flag = 0;
int v = stk[top-1];
if (top >= idx-(n-2))
return;
for (int i = head[v]; i != -1; i = e[i].next)
if (!vis[i]) {
flag = 1;
vis[i] = 1;
stk[top++] = e[i].v;
break;
}
if (!flag)
--top;
}
}
int main() {
while (scanf("%d", &n) != EOF && n) {
if (n == 1) {
printf("0123456789\n");
continue;
}
idx = top = 0;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
lim = 1;
for (int i = 1; i < n; i++)
lim *= 10;
edge = lim * 10;
mod = lim / 10;
for (int i = 0; i < lim; i++)
for (int j = 9; j >= 0; j--)
insert(i, (i%mod)*10+j);
dfs();
for (int i = 0; i < top-1; i++)
printf("%d", stk[i]/mod);
printf("%d", stk[top-1]);
for (int i = 1; i < n; i++)
printf("0");
printf("\n");
}
return 0;
}
POJ - 1780 Code (欧拉回路+手写DFS),布布扣,bubuko.com
标签:des style color os io for ar div
原文地址:http://blog.csdn.net/u011345136/article/details/38446775