[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
#include
int a[1000],bb,c,tl;
int lc[6000][10];
int test(int aaa[])
{
    int flag;
    for(int i=0;i0;
        for(int ii=0;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;ilc[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;iif(i!=0)
                printf(" ");
                printf("%d",aa[i]); 
            }

            printf("\n");
        }
    }
    else
    for(int i=0;iif(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"%d",&d);
            add(d);
        }
        int aaaa[10]={0};
        search(0,aaaa);
    }

}

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

你可能感兴趣的:([1620]全数列-dfs的首次运用)