Sequence two(hdu2611dfs)

来源:互联网 发布:轻小说 知乎 编辑:程序博客网 时间:2024/06/06 18:39

题意:同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;}


原创粉丝点击