和西安邀请赛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; }
时间: 2024-10-14 19:29:13