1. 程式人生 > >用DFS輸出n個數的全排列(遞迴實現)

用DFS輸出n個數的全排列(遞迴實現)

最近在研究DFS,可能腦子不太夠吧,很多題都不知道怎麼實現,全排列應該是最簡單的題了。

執行成功的程式碼如下所示:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

int n;
int vis[11] = {0} ;//訪問陣列 
int numth[11] ;

void dfs(int x)
{
	int i;
	if(x>n) //x大於n時輸出,不能等於,等於時numth[n]還沒被賦值 
	{
		for(i=1;i<=n;i++)
			cout<<numth[i]<<" ";
		cout<<endl;
	}
	for(i=1;i<=n;i++)
	{
		if(!vis[i]) //判斷是否被訪問 
		{
			vis[i] = 1;
			numth[x] = i; 
			dfs(x+1);
			vis[i] = 0;	//回溯				
		}

	}
}

int main()
{
	while(cin>>n)
	{
		memset(vis,0,sizeof(vis));//訪問陣列置0 
		dfs(1);		//陣列numth[]從1開始遍歷,注意不是0 
	}

	return 0;
}

但是當我換了一種方式描述時,卻出現了bug,我不知道問題出在哪裡,可能以後我就突然解決了,還請各位大神多多幫助

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

int n;
int vis[11] = {0} ;//訪問陣列 
int numth[11] ;

void dfs(int x)
{
	int i;
	if(x>n) //x大於n時輸出,不能等於,等於時numth[n]還沒被賦值 
	{
		for(i=1;i<=n;i++)
			cout<<numth[i]<<" ";
		cout<<endl;
	}
	for(i=1;i<=n && (!vis[i]) ;i++)
	{
		vis[i] = 1;
		numth[x] = i; 
		dfs(x+1);
		vis[i] = 0;	//回溯				
		
	}
}

int main()
{
	while(cin>>n)
	{
		memset(vis,0,sizeof(vis));//訪問陣列置0 
		dfs(1);		//陣列numth[]從1開始遍歷,注意不是0 
	}

	return 0;
}

比如我輸入3,表示要求3的全排列時,結果顯示為

3 2 1

然而上面正確的程式碼顯示的是

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1