#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll a[11];
bool used[11];
ll ans[11];
void recursion(ll i){
if(i > n){
for(int i =1;i <=n;i++){
cout <<ans[i]<<" ";
}
cout << endl;
return;
}
for(ll j=1;j <=n;j++){
if(!used[j]){
ans[i] = a[j];
used[j]=1;
recursion(i+1);
used[j]=0;
}
}
}
int main(){
cin >> n;
for(int i =1;i <=n;i++)
a[i]=i;
recursion(1);
return 0;
}
这段代码应该学习一下,
for(ll j=1;j <=n;j++){
if(!used[j]){
ans[i] = a[j];
used[j]=1;
recursion(i+1);
used[j]=0;
}
}
这段代码作为核心,这样的代码会考虑顺序,不会优先造成答案乱序(可以与下面代码进行类比),应该还是算学到树算法时用到的递归了。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll n;
ll a[11];
void recursion(ll i){
if(i == n){
for(int i =1;i <=n;i++){
cout <<a[i]<<" ";
}
cout << endl;
return;
}
for(ll j=i;j <=n;j++){
swap(a[j],a[i]);
recursion(i+1);
swap(a[j],a[i]);
}
}
int main(){
cin >> n;
for(int i =1;i <=n;i++)
a[i]=i;
recursion(1);
return 0;
}
感谢题解里的大佬给的思路。2021.11.8



京公网安备 11010502036488号