DFS全排列和组合问题(搜索篇)

全排列问题

题目描述:
把1~N这N个整数按不同的顺序摆放,输出所有可能的结果(按字典序从小到大)

这个搜索大致是这样的流程:
深度搜索按照当前填充排列的顺序往后延伸,先放第一个位置,再放第二个位置,以此类推。因为排列的要求是不能有重复的数字,所以需要使用visit[]数组来表示1到n中的某个数字是否被用过。

当你需要在第m个位置上放数字时,你需要将所有可能放的数字检查一遍,看看他们是否被用过,如果没有就放进这个数字,然后搜索下一个位置。这样可以保证所有的可能都被考虑到,因为所有位置所有可能的数字都被考虑了,并且是保证序列正确的情况下进行的搜索。所以只有填满序列,就一定是一个排列。同样的,因为搜索有一定的顺序。例如从序列的第一位到第n位,从数字1往数字n判断是否能填入,所以搜到的序列也是没有重复的,也同样是一个完整的全排列。

(如果难理解,可以在纸上用笔记录代码运行过程,多推几遍即可)

我的代码:

int n,v[20],hashtable[20] = {0};
void DFS(int index)
{
	if (index == n)
	{
		for (int i = 0 ;i < n ;i++)
		{
			printf("%d",v[i]);
			if (i != n - 1) printf(" ");
			else printf("\n");
		}
		return ;
	}
	for (int i = 1 ;i <= n ;i++)
	{
		if (hashtable[i] == 0)
		{
			v[index] = i;
			hashtable[i] = 1;
			DFS(index + 1);
			hashtable[i] = 0;
		}
	}
}

组合问题

题目描述:
组合就是从n个元素中抽出r个元素(不分顺序且r < = n),输出所有可能的组合(按字典序从小到大)

我的代码:

vector<int> v;
int n,r,num[10];
void DFS(int cnt,int index)
{
	if (cnt == r)
	{
		for (int i = 0 ;i < v.size() ;i++)
		{
			printf("%d",v[i]);
			if (i < v.size() - 1) printf(" ");
			else printf("\n");
		}
		return ;
	}
	if (index >= n) return;
	v.push_back(num[index]);
	DFS(cnt+1,index+1);//选择num[index]
	v.pop_back();//把选择的pop出来
	DFS(cnt,index+1);//不选择num[index]
}

(参考:大佬哦啦哦啦!)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情书、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值