国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

遞歸實現(xiàn) 組合問題+排列問題(DFS)

這篇具有很好參考價值的文章主要介紹了遞歸實現(xiàn) 組合問題+排列問題(DFS)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

遞歸實現(xiàn)排列型枚舉

遞歸實現(xiàn)排列類型枚舉 II

?遞歸實現(xiàn)組合型枚舉

遞歸實現(xiàn)組合型枚舉 II

遞歸實現(xiàn)指數(shù)型枚舉

遞歸實現(xiàn)指數(shù)型枚舉 II


遞歸不是循環(huán),遞歸利用了系統(tǒng)棧,只要是函數(shù)都會被系統(tǒng)管理。當(dāng)執(zhí)行到函數(shù)地址入口時就會為函數(shù)在系統(tǒng)棧上分配一塊內(nèi)存。當(dāng)函數(shù)在自己內(nèi)部再次調(diào)用自己,那么系統(tǒng)又會給此時調(diào)用的函數(shù)再次分配內(nèi)存,結(jié)果說就是層層調(diào)用。遞歸就是這么回事。

遞歸實現(xiàn)排列型枚舉

把?1~n?這?n?個整數(shù)排成一行后隨機(jī)打亂順序,輸出所有可能的次序。

輸入格式

一個整數(shù)?n。

輸出格式

按照從小到大的順序輸出所有方案,每行?1?個。

首先,同一行相鄰兩個數(shù)用一個空格隔開。

其次,對于兩個不同的行,對應(yīng)下標(biāo)的數(shù)一一比較,字典序較小的排在前面。

數(shù)據(jù)范圍

1≤n≤9

輸入樣例:

3

輸出樣例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<iostream>
using namespace std;
const int N=10;
bool st[N];
int g[N];
int n;
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            g[u]=i;
            st[i]=true;
            dfs(u+1);
            st[i]=false;
        }
    }
}
int main()
{
    cin>>n;
    dfs(0);
    return 0;
}

遞歸實現(xiàn)排列類型枚舉 II

給定一個長度為?n?的可包含重復(fù)數(shù)字的序列,請你求出其所有不重復(fù)的全排列。

輸入格式

第一行包含整數(shù)?n。

第二行包含?n?個整數(shù)。

輸出格式

輸出所有的不同排列,每種排列占一行。

在確定每種排列的輸出順序時,第一個數(shù)較小的先輸出,第一個數(shù)相同時,第二個數(shù)較小的先輸出,以此類推。

數(shù)據(jù)范圍

1≤n≤9
數(shù)組中包含的元素的取值范圍?[1,9]

輸入樣例:

3
1 1 2

輸出樣例:

1 1 2
1 2 1
2 1 1

?遞歸實現(xiàn) 組合問題+排列問題(DFS),深度優(yōu)先,算法,圖論

#include<iostream>
#include<algorithm>
using namespace std;
const int N=10;
bool st[N];
int a[N];
int g[N];
int n;
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++) cout<<g[i]<<" ";
        cout<<endl;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        //剪枝1
        if(!st[i])
        {
            st[i]=true;
            g[u]=a[i];
            dfs(u+1);
            st[i]=false;
            //這一步就是剪枝2 很nice
            while(a[i]==a[i+1]) i++;
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    dfs(0);
    return 0;
}

?遞歸實現(xiàn)組合型枚舉

從?1~n 這?n?個整數(shù)中隨機(jī)選出?m?個,輸出所有可能的選擇方案。

輸入格式

兩個整數(shù)?n,m?在同一行用空格隔開。

輸出格式

按照從小到大的順序輸出所有方案,每行?1?個。

首先,同一行內(nèi)的數(shù)升序排列,相鄰兩個數(shù)用一個空格隔開。

其次,對于兩個不同的行,對應(yīng)下標(biāo)的數(shù)一一比較,字典序較小的排在前面(例如?1 3 5 7?排在?1 3 6 8?前面)。

數(shù)據(jù)范圍

n>0
0≤m≤n
n+(n?m)≤25

輸入樣例:

5 3

輸出樣例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

思考題:如果要求使用非遞歸方法,該怎么做呢?

#include<iostream>
#include<algorithm>
using namespace std;
const int N=25;
int g[N];
bool st[N];
int n,m;
void dfs(int u,int start)
{
    if(u==m)
    {
        for(int i=0;i<m;i++) cout<<g[i]<<" ";
        cout<<endl;
        return ;
    }
    for(int i=start;i<=n;i++)
    {
        if(!st[i])
        {
            
            st[i]=true;
            g[u]=i;
            dfs(u+1,i+1);
            st[i]=false;
        }
    }
}
int main()
{
    cin>>n>>m;
    dfs(0,1);
    return 0;
}

遞歸實現(xiàn)組合型枚舉 II

給定一個長度為?n?的可包含重復(fù)數(shù)字的序列,從中隨機(jī)選取?m?個數(shù)字,輸出所有可能的選擇方案。

輸入格式

第一行包含兩個整數(shù)?n,m。

第二行包含?n?個正整數(shù)。

輸出格式

按照從小到大的順序輸出所有方案,每行?1?個。

首先,同一行內(nèi)的數(shù)升序排列,相鄰兩個數(shù)用一個空格隔開。

其次,對于兩個不同的行,對應(yīng)下標(biāo)的數(shù)一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

數(shù)據(jù)范圍

n>0
0≤m≤n
n+(n?m)≤25
序列內(nèi)所有元素均不大于?n。

輸入樣例:

5 3
1 2 2 3 3

輸出樣例:

1 2 2
1 2 3
1 3 3
2 2 3
2 3 3
#include<iostream>
#include<algorithm>
using namespace std;
const int N=25;
int a[N];
int g[N];
bool st[N];
int n,m;
void dfs(int u,int start)
{
    if(u==m)
    {
        for(int i=0;i<m;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=start;i<=n;i++)
    {
    
      //只留下相同的數(shù)的第一個取組合 不能是 while(a[i-1]==a[i])i++;這樣的話不能構(gòu)成122
      //只有輪到第2個2開始排的時候需要跳過 前一個2已經(jīng)恢復(fù)現(xiàn)場顧加上!st[i-1]可以使其跳過
        if(i != 0 && !st[i-1] && a[i-1] == a[i]) continue;
        g[u]=a[i];
        st[i] = true;
        dfs(u+1, i+1);
        st[i] = false;
       
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    dfs(0,1);
    return 0;
}

遞歸實現(xiàn)指數(shù)型枚舉

從?1~n?這?n?個整數(shù)中隨機(jī)選取任意多個,輸出所有可能的選擇方案。

輸入格式

輸入一個整數(shù)?n。

輸出格式

每行輸出一種方案。

同一行內(nèi)的數(shù)必須升序排列,相鄰兩個數(shù)用恰好?1?個空格隔開。

對于沒有選任何數(shù)的方案,輸出空行。

本題有自定義校驗器(SPJ),各行(不同方案)之間的順序任意。

數(shù)據(jù)范圍

1≤n≤15

輸入樣例

3

輸出樣例:


3
2
2 3
1
1 3
1 2
1 2 3
#include<iostream>
using namespace std;
const int N=16;
int g[N];
bool st[N];
int n;
void dfs(int u,int start)
{
    if(u<=n) 
    {
        for(int i=0;i<u;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=start;i<=n;i++)
       {
           if(!st[i])
           {
               st[i]=true;
               g[u]=i;
               dfs(u+1,i+1);
               st[i]=false;
           }
       }
}
int main()
{
    cin>>n;
    dfs(0,1);
    return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=20;
int g[N];
int n;
void dfs(int u,int start)
{
    if(u<=n)
    {
        for(int i=0;i<u;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=start;i<=n;i++)
    {
        g[u]=i;
        dfs(u+1,i+1);
    }
}
int main()
{
    cin>>n;
    dfs(0,1);
}

?

遞歸實現(xiàn)指數(shù)型枚舉 II

給定一個長度為?n?的可包含重復(fù)數(shù)字的序列,從中隨機(jī)選取任意多個數(shù)字,輸出所有可能的選擇方案。

輸入格式

第一行包含一個整數(shù)?n,表示序列長度。

第二行包含?n?個正整數(shù)。

輸出格式

每行輸出一種方案。

同一行內(nèi)的數(shù)必須升序排列,相鄰兩個數(shù)用恰好1個空格隔開。

對于沒有選任何數(shù)的方案,輸出空行。

本題有自定義校驗器(SPJ),各行(不同方案)之間的順序任意。

數(shù)據(jù)范圍

1≤n≤15
序列內(nèi)所有元素均不大于?n。

輸入樣例:

3
1 2 2

輸出樣例:


1
2
1 2
2 2
1 2 2
#include<iostream>
#include<algorithm>
using namespace std;
const int N=16;
int g[N];
int a[N];
bool st[N];
int n;
void dfs(int u,int start)
{
    if(u<=n)
    {
        for(int i=0;i<u;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=start;i<=n;i++)
    {
        if(!st[i])
        {
            st[i]=true;
            g[u]=a[i];
            dfs(u+1,i+1);
            st[i]=false;
            while(a[i]==a[i+1]) i++;
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    dfs(0,1);
    return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
const int N=16;
int g[N];
int a[N];
bool st[N];
int n;
void dfs(int u,int start)
{
    if(u<=n)
    {
        for(int i=0;i<u;i++) cout<<g[i]<<" ";
        cout<<endl;
    }
    for(int i=start;i<=n;i++)
    {
       if(i!=1&&!st[i-1]&&a[i]==a[i-1]) continue;
            st[i]=true;
            g[u]=a[i];
            dfs(u+1,i+1);
            st[i]=false;
            
        
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    dfs(0,1);
    return 0;
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-616291.html

到了這里,關(guān)于遞歸實現(xiàn) 組合問題+排列問題(DFS)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何實現(xiàn)一個簡單的深度優(yōu)先搜索(DFS)算法?

    如何實現(xiàn)一個簡單的深度優(yōu)先搜索(DFS)算法?

    前端入門之旅:探索Web開發(fā)的奇妙世界 記得點(diǎn)擊上方或者右側(cè)鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那些對Web開發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無論你是完全的新手還是有一些基礎(chǔ)的開發(fā)者,這里都將為你提供一

    2024年02月07日
    瀏覽(21)
  • 力扣--深度優(yōu)先算法/回溯算法47.全排列 Ⅱ

    力扣--深度優(yōu)先算法/回溯算法47.全排列 Ⅱ

    思路分析: 使用DFS算法進(jìn)行全排列,遞歸地嘗試每個可能的排列方式。 使用 path 向量保存當(dāng)前正在生成的排列,當(dāng)其大小達(dá)到輸入數(shù)組的大小時,將其加入結(jié)果集。 使用 numvisited 向量標(biāo)記每個數(shù)字是否已經(jīng)被訪問過,以確保每個數(shù)字在一個排列中只使用一次。 在遞歸過程中

    2024年03月13日
    瀏覽(24)
  • AcWing 93:遞歸實現(xiàn)組合型枚舉 ← DFS

    AcWing 93:遞歸實現(xiàn)組合型枚舉 ← DFS

    【題目來源】 https://www.acwing.com/problem/content/95/ 【題目描述】 從 1~n 這 n 個整數(shù)中隨機(jī)選出 m 個,輸出所有可能的選擇方案。 【輸入格式】 兩個整數(shù) n,m,在同一行用空格隔開。 【輸出格式】 按照從小到大的順序輸出所有方案,每行 1 個。 首先,同一行內(nèi)的數(shù)升序排列,

    2024年02月14日
    瀏覽(20)
  • 深度優(yōu)先搜索(DFS)算法

    目錄 算法思想 時間復(fù)雜度和空間復(fù)雜度 算法實現(xiàn) 算法優(yōu)缺點(diǎn) 應(yīng)用領(lǐng)域 深度優(yōu)先搜索(DFS)算法的思想是從圖的某個起始頂點(diǎn)開始,沿著一條路徑盡可能深入地訪問圖中的所有頂點(diǎn),直到不能繼續(xù)為止,然后返回并探索其他路徑。具體而言,DFS算法使用棧數(shù)據(jù)結(jié)構(gòu)來實現(xiàn),

    2024年02月05日
    瀏覽(34)
  • 深度優(yōu)先搜索(DFS)(算法筆記)

    深度優(yōu)先搜索(DFS)(算法筆記)

    本文內(nèi)容基于《算法筆記》和官方配套練題網(wǎng)站“晴問算法”,是我作為小白的學(xué)習(xí)記錄,如有錯誤還請體諒,可以留下您的寶貴意見,不勝感激。 深度優(yōu)先搜索是一種枚舉所有完整路徑以遍歷所有情況的搜索方法,總是以“深度”作為前進(jìn)的。實現(xiàn)方式是有很多,最

    2024年02月08日
    瀏覽(20)
  • 259.【華為OD機(jī)試真題】特殊的加密算法(深度優(yōu)先搜索(DFS)-Java&Python&C++&JS實現(xiàn))

    ??點(diǎn)擊這里可直接跳轉(zhuǎn)到本專欄,可查閱頂置最新的華為OD機(jī)試寶典~ 本專欄所有題目均包含優(yōu)質(zhì)解題思路,高質(zhì)量解題代碼(JavaPythonC++JS分別實現(xiàn)),詳細(xì)代碼講解,助你深入學(xué)習(xí),深度掌握!

    2024年02月21日
    瀏覽(18)
  • [算法日志]圖論: 深度優(yōu)先搜索(DFS)

    ? 深度優(yōu)先搜索算法是一種遍歷圖這種數(shù)據(jù)結(jié)構(gòu)的算法策略,其中心思想是朝圖節(jié)點(diǎn)的一個方向不斷跳轉(zhuǎn),當(dāng)該節(jié)點(diǎn)無下一個節(jié)點(diǎn)或所有方向都遍歷完時,便回溯朝上一個節(jié)點(diǎn)的另一個方向繼續(xù)遍歷。這種搜索策略與回溯法有異曲同工之妙。 正因為和回溯法有相似之處,所

    2024年02月03日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】圖遍歷算法 ( 深度優(yōu)先搜索 DFS | 深度優(yōu)先搜索和廣度優(yōu)先搜索 | 深度優(yōu)先搜索基本思想 | 深度優(yōu)先搜索算法步驟 | 深度優(yōu)先搜索理論示例 )

    【數(shù)據(jù)結(jié)構(gòu)與算法】圖遍歷算法 ( 深度優(yōu)先搜索 DFS | 深度優(yōu)先搜索和廣度優(yōu)先搜索 | 深度優(yōu)先搜索基本思想 | 深度優(yōu)先搜索算法步驟 | 深度優(yōu)先搜索理論示例 )

    圖 的 遍歷 就是 對 圖 中的 結(jié)點(diǎn) 進(jìn)行遍歷 , 遍歷 結(jié)點(diǎn) 有如下兩種策略 : 深度優(yōu)先搜索 DFS 廣度優(yōu)先搜索 BFS \\\" 深度優(yōu)先搜索 \\\" 英文名稱是 Depth First Search , 簡稱 DFS ; DFS 基本思想 : 訪問第一個鄰接結(jié)點(diǎn) : 從 起始點(diǎn) 出發(fā) , 該 起始點(diǎn) 可能有 若干 鄰接結(jié)點(diǎn) , 訪問 第一個 鄰接結(jié)點(diǎn)

    2024年02月02日
    瀏覽(20)
  • 圖的遍歷(搜索)算法(深度優(yōu)先算法DFS和廣度優(yōu)先算法BFS)

    圖的遍歷(搜索)算法(深度優(yōu)先算法DFS和廣度優(yōu)先算法BFS)

    從圖的某個頂點(diǎn)出發(fā)訪問遍圖中所有頂點(diǎn),且每個頂點(diǎn)僅被訪問一次。(連通圖與非連通圖) 1、訪問指定的起始頂點(diǎn); 2、若當(dāng)前訪問的頂點(diǎn)的鄰接頂點(diǎn)有未被訪問的,則任選一個訪問之;反之,退回到最近訪問過的頂點(diǎn);直到與起始頂點(diǎn)相通的全部頂點(diǎn)都訪問完畢; 3、若

    2024年01月17日
    瀏覽(25)
  • 第一周算法訓(xùn)練(dfs)(深度優(yōu)先搜索算法)

    第一周算法訓(xùn)練(dfs)(深度優(yōu)先搜索算法)

    dfs: 深度優(yōu)先搜索算法 ,是一種用于遍歷或 搜索樹或圖的算法 .沿著樹的深度遍歷樹的節(jié)點(diǎn),盡可能深的搜索樹的分支。當(dāng)節(jié)點(diǎn)v的所在邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)節(jié)點(diǎn)v的那條邊的起始節(jié)點(diǎn)。這一過程一直進(jìn)行到已發(fā)現(xiàn)從源節(jié)點(diǎn)可達(dá)的所有節(jié)點(diǎn)為止。如果還存在未被

    2024年02月20日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包