全排列问题
全排列问题
思路: 定义一个函数,函数里的变量用于计数。数组a用于放数,数组b表示位置标记(为了方便在一个序列中数字不重复)。从1开始深搜,搜索时运用回溯判定即可。然后就是找出口,出口当然是搜索次数 大于n或者等于n + 1的时候,进行输出。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[101],b[101];
void dfs(int x)
{
if(x==n+1)//个数满足
{
for(int i=1;i<=n;i++)//输出
printf("%5d",a[i]);
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)//未被标记
{
a[x]=i;//保存
b[i]=1;//标记
dfs(x+1);//进行下一轮递归
b[i]=0;//回溯,返回上一步(清空标记)
}
}
}
int main()
{
cin>>n;
dfs(1);//从1开始深搜
return 0;
}

浙公网安备 33010602011771号