深度优先搜索与全排列

      做题过程中我们经常会遇到这样的问题:

输入一个数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);
     }
   返回
}



  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值