标签:
7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0
1 2 3 4 5 6 1 2 3 4 5 7 1 2 3 4 6 7 1 2 3 5 6 7 1 2 4 5 6 7 1 3 4 5 6 7 2 3 4 5 6 7 1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1 2 3 8 13 21 1 2 3 8 13 34 1 2 3 8 21 34 1 2 3 13 21 34 1 2 5 8 13 21 1 2 5 8 13 34 1 2 5 8 21 34 1 2 5 13 21 34 1 2 8 13 21 34 1 3 5 8 13 21 1 3 5 8 13 34 1 3 5 8 21 34 1 3 5 13 21 34 1 3 8 13 21 34 1 5 8 13 21 34 2 3 5 8 13 21 2 3 5 8 13 34 2 3 5 8 21 34 2 3 5 13 21 34 2 3 8 13 21 34 2 5 8 13 21 34 3 5 8 13 21 34
下面我来讲讲全排列问题吧!
把筛选出来的数用一个数组存起来,其实深搜就是递归回溯,当不满足条件是返回到上一层,这个全排列也是一样,当筛选完了之后输出结果,没选到则再次回溯,我的理解就是返回到上一层,接着筛选,全排列,最小步数等问题,回溯之后要把标记是否访问过的数组还原成原样,因为其他方式也可以走到那一步。
这种题目以及N皇后问题都有一个固定的套路,可以说是个模板:
有一个判断,判断是否接着往下走(即递归),有一个最后是否找到一个方式的判断条件,找到了输出,没找到就回溯,写代码确实很简单,但相同确实不简单,我昨天痛苦的照着别人的代码写N皇后问题,似懂非懂,今天也做了不少题了,了解了这种题目的做法,就是一直往下找,知道找到满足条件的方式,找到了也会回溯,递归就像栈一样,一开始一直往里面放东西,即一直递归,你要跳出来是也是一层一层跳出来的。
#include<stdio.h>
#include<string.h>
int a[10100];
int select[7];
bool vis[10010];
int n;
void DFS(int c)
{
if(c==7)//c==7时刚好选出6个数
{
for(int i=1;i<=6;++i)
printf("%d ",select[i]);
printf("\n");
}
for(int i=1;i<=n;++i)
{
if(a[i]>=select[c-1]&&!vis[a[i]])
{
select[c]=a[i];
vis[a[i]]=1;
DFS(c+1);
vis[a[i]]=0;
}
}
}
int main()
{
while(~scanf("%d",&n),n)
{
memset(select,0,sizeof(select));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i)
{
scanf("%d",a+i);
}
DFS(1);
printf("\n");
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yuzhiwei1995/article/details/47281577