#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,p;
int cnt,len;
struct node{
int pos,val;
}a[105];
int res[105]; //用来记录当前生成的路径
bool cmp(node a,node b){
if(a.val != b.val)
return a.val < b.val;
return a.pos<b.pos;
}
//pos 当前考虑到了哪个下标 cur_len 当前已经生成的长度 pre_pos 上一位
//需要满足index的递增性
bool dfs(int pos,int cur_len,int pre_pos){
if(cur_len == len){
cnt++; //得到了一个解,记录数加一
for(int i=0;i<cur_len-1;i++)
printf("%d ",res[i]);
printf("%d\n",res[cur_len-1]);
if(cnt==p) return true; //已经得到了规定的长度
return false;
}
int pre;
bool flag = false;
for(int i=pos;i<n;i++){
if(a[i].pos > pre_pos){
if(!flag){
flag = true;
pre = a[i].val;
}
else if(pre == a[i].val) continue;
pre = a[i].val;
res[cur_len] = a[i].val;
if(dfs(i+1,cur_len+1,a[i].pos)) return true;
}
}
return false;
}
int main(){
while(scanf("%d%d",&n,&p)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i].val);
a[i].pos = i;
}
sort(a,a+n,cmp);
cnt = 0; //统计当前已经生成了多少个子串
for(int i=1;i<n;i++){
len = i; //当前需要生成子串的长度
if(dfs(0,0,-1)) break;
}
printf("\n");
}
return 0;
}
HDU 2611 Sequence Two dfs
最新推荐文章于 2021-09-12 13:26:16 发布