题目大意:给出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;
}