c++ n的全排列遞歸實現


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); }

后面繼續努力,祝我,也祝各位在算法的道路上堅持下來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM