poj 1780 欧拉回路构造字符串

和西安邀请赛D题类似的题目

这道题会爆栈,所以要非递归写,但是看了很久其实代码没理解,回头重写

题解:http://blog.csdn.net/dongshimou/article/details/37815377

http://www.cnblogs.com/372465774y/p/3200775.html

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;

const int SIZE = 100000+10;

int a,s;
int sta[SIZE*10],li[SIZE*10];
char ans[SIZE*10];

void sea(int v, int m)
{
    int w;
    while(li[v]<10)
    {
        w=v*10+li[v];//相当于左移一位,就是以前一个数的最后n-1位左移一位作为第二个数的前n-1位
        li[v]++;    //li[v]范围是0-9,,就是第v位,把各种试过来,并且保证前面没出现过,因为上一行li[v]已经用过,所以试li[v]+1
        sta[s++]=w;//sta里存的是答案,注意0表示n-1个0
        v=w%m;   //移位"溢出"
    }
}

int main()
{
    int n,m;

    while(~scanf("%d", &n) && n)
    {
        if(n == 1)
        {
            printf("0123456789\n");
            continue;
        }
        int v=0;
        s=a=0;
        m=pow(10.0, double (n-1) );
        for(int i=0;i<m;i++)li[i]=0;
        sea(v, m);
        while(s)
        {
            v=sta[--s];
            ans[a++]=v%10+'0';
            v/=10;
            sea(v, m);
        }
        for(int i=1; i<n; i++)putchar('0');
        while(a)putchar(ans[--a]);
        putchar('\n');
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值