题意:同2610一样,但是最后的输出序列要是有序的
思路:dfs,你原序列是什么,dfs出来就是什么,如果想输出的序列式有序的,先对原序列排序,保存原序列的下标。
搜索的时候和2610一样,多了一个判断条件,序列是递增的,下标也是递增的,还要判断他的下标是否递增,如果是符合条件
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int count_ = 0,len,n,p;
struct number
{
int num,ind;
int pos;
}path[100010];
struct numbe
{
int n;
int pos;
}num[1001];
void dfs(int dep,int pos,int last)
{
bool flag = false;
if(count_ >= p)
return;
if(dep == len)
{
count_++;
int i;
for(i = 0; i < len-1; i++)
printf("%d ",path[i].num);
printf("%d\n",path[i].num);
return ;
}
int i,pre;
for(i = pos; i < n; i++)
{
if(num[i].pos > last)
{
if(!flag)
{
flag = true;
pre = num[i].n;
}
else if(pre == num[i].n)
{
continue;
}
path[dep].num = num[i].n;
pre = num[i].n;
dfs(dep+1,i+1,num[i].pos);
}
}
return ;
}
bool cmp(numbe a,numbe b)
{
if(a.n < b.n)
return true;
else if(a.pos < b.pos)
return true;
else
return false;
}
int main()
{
while(scanf("%d%d",&n,&p) != EOF)
{
int i;
memset(num,0,sizeof(num));
for(i = 0; i < n ; i++)
{
scanf("%d",&num[i].n);
num[i].pos = i;
}
sort(num,num+n,cmp);
count_ = 0;
for(i = 1; i < n; i++)
{
len = i;
dfs(0,0,-1);
}
printf("\n");
}
return 0;
}