#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