本文主要是介绍深度优先搜索与全排列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
做题过程中我们经常会遇到这样的问题:
输入一个数n,输出1-n的全排列。可能很多人会想到枚举暴力,这里给大家介绍一种算法:深度优先搜索
在这里举个简单的例子
假如有编号为1 、2、3 的3 张扑克牌和编号为l 、2 、3 的3 个盒子。
现在需要将这3 张扑克牌分别放到3 个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种不同的放法呢?
首先 我们应该设置一个标志数组 book 记录当前数字是否被使用过。
然后用一个数组a 表示盒子并且初始化a[i]=i;
代码如下:
#include<stdio.h>
int n,a[10],book[10];//特别说明c语言全局变量没有赋值默认为 0,无需再次初始化;
void dfs(int step)//step 表示当前在第几个位置
{int i;if(step==n+1)//如果step==n+1表示前n个数字已经放好 {//输出一种全排列 for(i=1;i<=n;i++)printf("%d",a[i]);printf("\n");return; }//每次搜索都从1-n 一一尝试 for(i=1;i<=n;i++){if(book[i]==0)//判断次数字是否用过 {a[step]=i;//存储当前位置的数字,以便满足条件输出 book[i]=1;//当前数字已用过,改变标志,以防重用 dfs(step+1);//放好当前位置数字之后,安排下一个数字 book[i]=0;//回溯,当满足一种全排列后,进行下一种尝试 }}return ;
}
int main()
{scanf("%d",&n);//输入只能为1-9之间的整数,表示1-n的全排列 dfs(1);//从第一个位置开始 return 0;
}
同时总结了下基本模型,希望有用:
void dfs(int step)
{判断边界尝试每一种可能for(i=1;i<=n;i++){继续下一步dfs(step+1);}返回
}
这篇关于深度优先搜索与全排列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!