用深度優先搜尋實現全排列
阿新 • • 發佈:2019-01-03
如何模擬出5個人站在一排所有站法?寫出一個5層迴圈好像就可以了,但是如果是n個人呢,我們不可能每次寫一個n層迴圈。但是深度優先搜尋,可以很容易實現這個問題。
輸入:每次給定一個n,代表n個人,n個人編號是從1到n
輸出:模擬所有站法。
//用搜索實現全排列。
#include<cstdio>
#include<cstring>
//#include<stack>
#include<algorithm>
using namespace std;
void dfs(int i);
const int maxn = 100;
int num[maxn];
int map[maxn];
int cop[maxn];
//stack<int> a;
int ans,n;
int main()
{
while(~scanf("%d",&n)) //n個人
{
for(int i=1;i<=n;++i)
{
num[i]=i; //第i個人的編號設定為i
map[i]=1;
}
dfs(1); //從第一開始搜尋
printf("%d\n",ans);
ans=0;
}
return 0;
}
void dfs(int i)
{
if(i==n+1) //搜尋到 n+1個人的時候停止搜尋
{
for(int i=1;i<=n;++i)
{
printf("%d ",cop[i]);
}
printf("\n");
ans++;
return ;
}
for (int j=1;j<=n;++j)
{
if(map[j]==1)
{
map[j]=0;
cop[i]=num[j];
dfs(++i);
i--;
map[j]=1;
}
}
}