习题2.8 输出全排列
利用库函数
#include <bits/stdc++.h>
int n,a[10],b[10];
using namespace std;
int main()
{
cin>>n;
for(int i = 0;i < n;i++)a[i] = i+1;
do{
for(int i = 0;i < n;i++){
cout<<a[i];
}
cout<<endl;
}while(next_permutation(a,a+n));
return 0;
}
利用递归
#include <stdio.h>
int n,a[10],b[10];
void dfs(int j){
if(j == n+1){
for(int i = 1;i<=n;i++){
printf("%d",a[i]);
}
printf("\n");
return;
}
else{
for(int i = 1;i <= n;i++){
if(b[i]==0){
a[j] = i;
b[i] = 1;
dfs(j+1);
b[i] = 0;
}
}
}
return;
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}
dfs问题模板
void dfs(int step)
{
if(到达目的地){
输出解
返回
}
合理的剪枝操作
for(int i = 1;i <= 枚举数;i++){
if(满足条件){
更新状态位;
dfs(step+1);
恢复状态位;
}
}
}
09-29
886
11-10
880
05-25