题目大意:给出1,2……n的序列,输出第m小的序列;1,2,3,……n是最小的序列,1,2,3……n,n-1是第2小的序列;给出你两个数n,m,(n表示有n个数,m表示第m小的序列),输出第m小的序列:
题目解析:此题和HDU1716题差不多,只需修改一些输出内容;不过我想了好久才想到,呵呵……
错误分析:此题要注意找到满足的答案,就不要再让它递归了,要不然就TEL!!!
#include<cstdio> #include<cstring> using namespace std; #define M 1005 int ret[M],use[M],a[M];//ret[]记录每个位置要填的数;use标记是否使用过, int n,m; int flag;//标记是否是m小的序列 void mth_small(int l ) { int i; if(flag==m)return;//注意找到满足的答案,就不要再让它递归了,要不然就TEL if(l==n&&m==++flag) { for( i=0;i<n;i++) { printf("%d",ret[i]); if(i<n-1) printf(" "); } printf("\n"); return;//注意找到后就不要往下运行了 } for(i=0;i<n;i++) { if(!use[i]) { use[i]=1;ret[l]=a[i]; mth_small(l+1); use[i]=0; } } } int init() { int i,j; int x,k=0; memset(use,0,sizeof(use)); if(scanf("%d%d",&n,&m)==EOF)return 0; for( i=0;i<n;i++) a[i]=i+1; flag=0; return 1; } int main() { while(init()) mth_small(0); return 0; }