2020年4月19日16:08:44添加:
1.最基礎的遞歸實現全排列:
#include<iostream> using namespace std; int n,a[30]; int sum; int f(int k){ // cout<<k<<endl; int i,j,flag; if(k<=n){ for(i=1;i<=n;i++) { a[k] = i; flag = 0; for(j=1;j<k;j++){//判斷前k個數與第k個數有重復不 if(a[j]==a[k]) flag = 1; } if(flag==0){ if(k==n){//最后一個數 sum++; for(j=1;j<=n;j++) cout<<a[j]; cout<<endl; }else{ f(k+1); } } } } else{ return sum; } } int main(){ cin>>n; f(1); cout<<sum; }
2.回溯法
#include"iostream" using namespace std; int n,f[100],ans[100]; void dfs(int k){ int i; if(k==n){ for(int j=1;j<=n;j++) cout<<ans[j]<<' '; cout<<endl; return; } for(i=1;i<=n;i++){ //未被遍歷過的 if(!f[i]){ f[i] = 1;//表示遍歷過了 ans[k+1] = i; dfs(k+1); f[i] = 0;//回溯 } } } int main(){ cin>>n; dfs(0); }
3.手寫交換法
#include<bits/stdc++.h> using namespace std; //求n的全排列 n!組數據 /* 每個全排列都有n個數,所以將求這n個數的全排列進行分解 : 1-求n-1的全排列 2-求n-2的全排列 3-求n-3的全排列 . . . n-求1的全排列 */ int n; int data[100]; //void swap(int& x,int& y){//交換兩個數的值 // int temp = x; // x = y; // y = temp; //} void swap(int *x,int *y){//形參為兩個指針 int temp = *x; x = y; *y = temp; } void solve(int t){ int i; if(t == n) { for(i=1;i<=n;i++) cout<<data[i]<<" "; cout<<endl; return; }
//前t個數的已確定 接下來確定后面的數 for(i = t; i <= n; i++){ //每次交換兩個數的值 swap(data[i],data[t]); //進入遞歸------->每次進入solve()即開始確認第t+1位上的數 //當t == n 那么就進行輸出這一組排列數據 solve(t + 1); //還原數組為原來狀態 swap(data[i],data[t]); } } int main(){ //初始化 數組 memset(data,0,sizeof(data)); cout<<"input n:"; cin>>n; //數組放入值 for(int i = 1; i <= n; i++) data[i]=i; solve(1); }
后面繼續努力,祝我,也祝各位在算法的道路上堅持下來。