标签: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