dfs-全排列

要求:输入一个为n的数,输出1~n的全排列。

解法:本题可以用多重循环来做,但是过于繁琐;但本题是一个典型的dfs问题,我们可以构造n个盒子,1~n个数看成n张卡片,我们需要做的就是如何将这n张卡片放入n个盒子中,且可以有多少种不同的放法,我们假定每个盒子中的卡片都是按照顺序的顺序放置,以n=3为例,在第一个盒子里,我们按照1~3的顺序放置一张1;在第二个盒子里也是如此,但此时我们手中还剩下2和3,故放入2;同理第三个盒子里放3。此时第一轮放法结束,接下来我们拿出第三个盒子里的3,因为是按照1~3的顺序来放置,所以无法在放入3,

我们将卡片拿在手上,来到第二个盒子并拿出里面的卡片 ,此时我们手中有2和3两张卡片,而对于第二个盒子,我们之前已近放过2,故按照顺序,只能放入3,这时候我们再次来到第三个盒子,将第2放入,形成新的放法132,同理可得余下所有的放法。具体代码如下:

                                                                                                                                                                                                                                                                                                                                                                                                                          

#include<stdio.h>
int a[10], book[10], n;
void dfs(int step)
{
	int i;
	if (step == n + 1)//第一轮所有盒子中都放满了卡片,输出
	{
		for (i = 1; i <= n; i++)
			printf("%d",a[i]);
		printf("\n");
		return;
	}
	for (i = 1; i <= n; i++)//对于第step个盒子,可放入1-n中任意的卡片,故用循环表示
	{
		if (book[i] == 0)
		{
			a[step] = i;
			book[i] = 1;

			dfs(step+1);
			book[i] = 0;//将尝试的卡片收回
		}
	}
	return;
}
int main()
{
	scanf("%d",&n);
	dfs(1);
	getchar(); getchar();
	return 0; 

}

                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值