2024-03-01
数据结构与算法
00
请注意,本文编写于 447 天前,最后修改于 435 天前,其中某些信息可能已经过时。

原题地址

法一: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 许可协议。转载请注明出处!