POJ 1780 Code

记录欧拉路径。

题意很难懂。英语渣,翻译半天不得要领。看PDF的中文才知道题意。

题意:给一个 N (1<=N<=6)找出字典序最短的所有数字组合都出现的序列。

给出了N=2 的例子。就拿这个说明,太长就说前面的。

00102030405060708091121314151617181922324252627282933435363738394454647484955657585966768697787988990

00 出现了,01出现,然后 10,02,20,03,30,04,40,05,50,06,60,07,70,08,80,09。

90不能在这里出现。因为0开头的已经全部出现了,如果这儿接0不能保证最短。91,(10miss)11,12,

前一个数字的尾必须作为下一个数字的首。

如果是多位N=6。前一个数字除了首位一个,剩下五个都必须作为下一个的头。这样排下去。

最后长度为 10^N+N-1。

取自PDF:

n 位数有10n 种编码方案(即10n 组数),要使得一个数字序列包含这10n 组n 位数,且序列的长

度最短,唯一的可能是每组数出现一次且仅一次、且前一组数的后n-1 位是后一组数的前n-1 位,

这样10n 组数各取1 位,共10n 位,再加上最后一组数的后n-1 位,总位数是10n + n - 1。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
#define M 100000

char str[7][M*10];
int l[M];
stack<int>s;
char ans[M * 10];
int a;

void dfs( int v, int m )
{
    int w;
    while ( l[v] < 10 )
    {
        w = v * 10 + l[v];
        l[v]++;
        s.push(w);
        v = w % m;
    }
}
int main( )
{
    int n, m, i, v;
    strcpy(str[1],"0123456789");
    for(int nn=2; nn<=6; nn++)
    {
        n=nn;
        while(!s.empty())s.pop();
        a = 0, v=0;
        m = pow( 10, double( n - 1 ) );
        for ( i = 0; i < m; i++ ) l[i] = 0;
        dfs( v, m );

        while(!s.empty())
        {
            v=s.top();
            s.pop();
            ans[a++] = v % 10 + '0';
            v /= 10;
            dfs( v, m );
        }
        int cot=0;
        for ( i = 1; i < n; i++ )
            str[nn][cot++]='0';
        while (a)
            str[nn][cot++]=ans[--a];
        str[nn][cot]='\0';
    }
    while(scanf("%d",&n),n)
        puts(str[n]);
}

POJ 1780 Code

时间: 2024-11-05 21:33:32

POJ 1780 Code的相关文章

POJ - 1780 Code (欧拉回路+手写DFS)

Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need a key but you are required to enter the correct n-digit code on a keypad (as if this were something new!). There are severa

POJ 1780 Code 欧拉回路+手写栈DFS

和西安邀请赛那道题题目差不多,现在终于会手写栈了,自己琢磨了好久,真是感动TAT #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdli

[欧拉回路+手动开栈] poj 1780 Code

题目链接: http://poj.org/problem?id=1780 Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2037   Accepted: 751 Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need

POJ 1780 Code (欧拉回路+非递归版dfs)

题目地址:POJ 1780 还是求序列的欧拉回路.只不过这题有两坑. 第一坑是用数字来当点的话,会MLE,因为每个数字可以连10条边,100w条边会MLE,即使用vector也会TLE.这题可以用边来记录,对于n为1时直接输出,然后后面的,比如12,23这两个点就用边权值为123来表示这两个点,这样就把点和边的范围都缩小了10倍. 第二坑是用递归的dfs会爆栈,亲测即使加手扩栈也会爆..(简直丧心病狂..)需要用非递归版dfs,也不难,dfs本身就是利用的栈,所以改成栈的形式就可以了. 代码如下

poj 1780 code(欧拉路)

/* 对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着 就是说 前一个的后n-1位是后一个的前n-1位 假设n==3 我们用0-99作为点的编号建图 然后每个点连出去10条边 两个相邻点有n-1个是重复的 边的权值可用两个点计算 比如 12 23 权值为123 123 234 权值为1234 显然最后的序列是每个边记录一次 也就是跑欧拉路 对于记录下的边权 第一条输出前n-1为 上下的输出最后一位 这就是答案了 poj上没有special judge 要求字典序最小 这里建边时

POJ 1780 Code(欧拉通路)

输入n(1<=n<=6),输出长度为10^n + n -1 的字符串答案. 其中,字符串以每n个为一组,使得所有组都互不相同,且输出的字符串要求字典序最小. 显然a[01...(n-1)]和a[12...n]为相邻组,可以看做有一条边从结点a[01...(n-1)]到结点a[12...n]. 题目转化成求欧拉通路.如果以每组的值为结点,则有10^6个结点,10^7条边.会MLE.(此时其实是哈密顿通路?) 这里以每组的值为边的边权,而边的2个结点分别是前n-1位数和后n-1位数.这样点是10^

poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串

两道题目意思差不多 第一题是10进制 , 第二题是2进制的 都是利用欧拉回路的fleury算法来解决 因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中导出来答案要倒一下了,这一点要注意 poj 1780 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 #define N 1000010 6 7 int

POJ 1850 Code 数位DP

据说又是一道组合数学题,数学不好的我只想出的DP写法 注意如果输入不合法要输出0 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdli

Code POJ - 1780(栈模拟dfs)

题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #include <vector&g