全排列的实现:
1.递归实现:
#include<iostream>
using namespace std;
void swap(int arr[],int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void printArr(int arr[],int n){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
void permutation(int arr[],int p,int q){
if(p==q){
printArr(arr,q+1);
}
else{
for(int i=p;i<=q;i++){
swap(arr,p,i);
permutation(arr,p+1,q);
swap(arr,p,i);
}
}
}
int main(){
int arr[]={1,2,3};
permutation(arr,0,2);
return 0;
}
按dfs模板来一种:
#include<iostream>//全排列问题
using namespace std;
int a[4];
int vis[4];
int count=0;
void dfs(int step)
{
if(step>3)
{
for(int i=1;i<=3;i++)
{
cout<<a[i]<<" ";
}
count++;
cout<<' '<<endl;
}
for(int j=1;j<=3;j++)//遍历N个数字
{
if(vis[j]==0)
{
vis[j]=1;
a[step]=j;
dfs(step+1);
vis[j]=0;
}
}
return ;
}
int main()
{
dfs(1);
cout<<count<<endl;
return 0;
}
还有stl里的next_permutation()
#include<iostream>
#include<algorithm>
using namespace std;
int permutation(int arr[]){
sort(arr,arr+3);
do{
for(int i=0;i<3;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}while(next_permutation(arr,arr+3));
}
int main(){
int arr[]={1,3,2};
permutation(arr);
return 0;
}
2018.11.12加一种回溯法求全排列具体看 N皇后回溯
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
bool check(int arr[],int k){
for(int i=1;i<k;i++){
if(arr[i]==arr[k] ){
return false;
}
}
return true;
}
int print(int arr[],int n){
for(int i=1;i<=n;i++){
cout<<arr[i];
}
}
int main(){
int n;
cin>>n;
int arr[1000]={0};
int k=1;
while(k>=1){
while(arr[k]<n){
arr[k]++;
if(check(arr,k) && k==n){
cout<<++arr[0]<<" ";
print(arr,n);
cout<<endl;
}
else if(check(arr,k)){
k++;
}
}
arr[k]=0;
k--;
}
return 0;
}
2019.5.27
由于数组输入的随机性,可以将待排列的数放入数组里面。如果不要按字典序输出可以去掉代码中排序的部分。。。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[20]={0};
int rs[20]={0};
int c[20]={0};
bool cmp(int a,int b){
return a<b;
}
bool check(int *a,int n){
for(int i=1;i<n;i++){
if(a[i]==a[n] ){
return false ;
}
}
return true;
}
int print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int k=1;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n,cmp);
while(k>=1){
while(c[k]<n){
rs[k]=a[c[k]++];
if(check(rs,k) && k==n){
print(rs,k);
}
else if(check(rs,k)){
k++;
}
}
rs[k]=0;
c[k]=0;
k--;
}
return 0;
}