poj 1780 欧拉回路构造字符串

来源:互联网 发布:微博客户端网络异常 编辑:程序博客网 时间:2024/06/06 02:53

和西安邀请赛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;}


1 0
原创粉丝点击