[1620]全数列-dfs的首次运用

为什么不让用iframe….


Description
给定n个数 a[0] , a[1] …….. a[n-1], 输出其全排列。

Input
第一行输入一个数n,(n<7)

接下来一行输入n个数。

Output
按字典序从小到大输出全排列

Sample Input
3
1 2 3
3
1 2 2

Sample Output
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 2
2 1 2
2 2 1

#include<stdio.h>
#include<string.h>
int a[1000],bb,c,tl;
int lc[6000][10];
int test(int aaa[])
{
    int flag;
    for(int i=0;i<tl;i++)
    {
        flag=0;
        for(int ii=0;ii<c;ii++)
        {
            //printf("%d,%d     \n",aaa[ii],lc[i][ii]);
            if(aaa[ii]==lc[i][ii])
            flag++;
        }
        if(flag==c)
        return 0;
    }
    for(int i=0;i<c;i++)
        lc[tl][i]=aaa[i];
    tl++;
    return 1;
}
int search(int n,int aa[])
{
//  printf("search with %d and %d\n",n,aa[n-1]);
    int t,k[1000];
    if(n>=c)
    {
        if(test(aa))
        {
            for(int i=0;i<c;i++){
                if(i!=0)
                printf(" ");
                printf("%d",aa[i]); 
            }

            printf("\n");
        }
    }
    else
    for(int i=0;i<c;i++)
    {
        if(a[i]!=-1)
        {
        aa[n]=a[i];
        t=a[i];
        a[i]=-1;
        search(n+1,aa);
        a[i]=t;
        }

    }
}
int add(int aa)
{
    //printf("%d into\n",aa);
    int t;
    a[bb]=aa;
    for(int i=bb-1;i>=0;i--)
    {
        if(a[i]>a[i+1])
        {
            t=a[i];
            a[i]=a[i+1];
            a[i+1]=t;
        }
        else
            break;
    }
    bb++;
}
int main()
{
    //freopen("out.txt","w",stdout);
    while(scanf("%d",&c)!=EOF)
    {
        tl=0,bb=0;
        int d;
        memset(a,0,sizeof(a));
        memset(lc,0,sizeof(lc));
        for(int i=0;i<c;i++)
        {
            scanf("%d",&d);
            add(d);
        }
        int aaaa[10]={0};
        search(0,aaaa);
    }

}

没什么技术又强烈想做这题的我先祭一张图:
233
对,然后就写了一套深度优先搜索;
解析:这段源码在main中读入所有的值
读入同时直接用插入排序排好,省去了后续的排序过程.
接着,从0位开始深度优先搜索.
搜索第一位,然后判断,一位不为-1,则把一位标记(占领)为-1,然后1位进行搜索search(1,aa);
这里为了方便,就把记录结果的数组带着走了.每次调用前,都会把下一位记录为当前数字.
这样一直进行,直到search的一参数>=一开始读入的数字个数c,则输出,然后返回.返回时,把之前占领的所有格子回溯,以便下一次搜索.
但是考虑到重复情况,每次输出前,用一个单独的子程序来判断是否有重复,如果有则不输出,没有则输出并记录.
因为题目数据范围(0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值