法一:dfs,可直接搜索,数据规模小或需要输出具体排列时使用
cpp#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i)
#define rrep(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)
#define lep(i, a, b) for(int i = (int)(a); i >= (int)(b); i--)
#define UPS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endn puts("")
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const double EPS = 1e-7, PI = acos(-1);
/*=======================================*/
int book[10]= {0},s=0;
int n,arr[10]= {0};
void dfs(){
if(s==n){
rrep(i,0,n){
printf("%5d",arr[i]);
}
endn;
}
rep(i,1,n){
if(!book[i]){
book[i]++;
arr[s++]=i;
dfs();
s--;
book[i]--;
}
}
}
int main() {
UPS;
cin>>n;
dfs();
return 0;
}
法二:使用c++自带的库函数next_permutation(),此库函数会将一段数组变为它的下一个全排列,只需统计次数,然后调用即可。
cpp#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (int)(a); i <= (int)(b); ++i)
#define rrep(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)
#define lep(i, a, b) for(int i = (int)(a); i >= (int)(b); i--)
#define UPS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endn puts("")
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f, MOD = 1e9 + 7;
const double EPS = 1e-7, PI = acos(-1);
/*=======================================*/
int sum=1;
int n,arr[10]= {0};
int main() {
UPS;
cin>>n;
rrep(i,0,n) arr[i]=n-i,sum*=arr[i];
for(int i=1;i<=sum;i++){
next_permutation(arr,arr+n);
rrep(i,0,n) {
printf("%5d",arr[i]);
}
endn;
}
return 0;
}
本文作者:KID
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!