1. 程式人生 > >dfs-全排列

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; 

}