2405_82991597 2024-12-10 09:17 采纳率: 0%
浏览 5

关于#c++#的问题:写一半到了回溯这一步非常迷惑,因为递归可以在递归的下面回溯,入栈以后就没法回溯了#include <bits>

用栈模拟递归实现全排列
这是用递归写的全排列

#include <bits/stdc++.h>
using namespace std;
vector<int> a,vis,res;
int n;
void dfs(){
    if(res.size()==n){
        for(auto &it:res) cout<<it<<' ';
        cout<<endl;
        return;
    }
    for(int i=0;i<n;i++){
        if(vis[i]) continue;;
        vis[i]=1;
        res.push_back(a[i]);
        dfs();
        vis[i]=0;
        res.pop_back();
    }
}
int main(){
    cin>>n;
    a.resize(n);
    vis.assign(n,0);
    for(int i=0;i<n;i++) cin>>a[i];
    dfs();
}

下面这个是用栈写的,写一半到了回溯这一步非常迷惑,因为递归可以在递归的下面回溯,但是用栈的话,入栈以后就没法回溯了

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int> a(n),vis(n,0),res(n);
    for(int i=0;i<n;i++) cin>>a[i];
    stack<int> st;
    st.push(0);
    while(!st.empty()){
        int cur=st.top();
        st.pop();
        for(int i=0;i<n;i++){

        }
    }
}

  • 写回答

1条回答 默认 最新

  • 赵4老师 2024-12-10 09:27
    关注

    仅供参考:

    //qplw.cpp
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int v=0;
    int w=0;
    int m;//记录字符串长度
    int n;//记录字符串中的字符种类数
    char map[256];//记录是哪几种字符
    int count[256];//记录每种字符有多少个
    int stack[1000];//递归用的栈,并记录当前生成的排列
    void Make_Map(char *str) {//统计字符串的相关信息
        int s[256];
        int i;
        memset(s,0,sizeof(s));
        memset(count,0,sizeof(count));
        m=strlen(str);
        if (w<1 || m<w) w=m;
        while(*str) {
            s[*str]++;
            str++;
        }
        n=0;
        for (i=0;i<256;i++)
            if (s[i]) {
                map[n]=i;
                count[n]=s[i];
                n++;
            }
    }
    void Find(int depth) {//递归式回溯法生成全排列
        if (depth==w) {
            int i;
            for (i=0;i<depth;i++) putchar(map[stack[i]]);
            putchar('\n');
        } else {
            int i;
            if (v && depth>0) {
                for (i=0;i<depth;i++) putchar(map[stack[i]]);
                putchar('\n');
            }
            for (i=0;i<n;i++)
                if (count[i]) {
                    stack[depth]=i;
                    count[i]--;
                    Find(depth+1);
                    count[i]++;
                }
        }
    }
    void main(int argc,char**argv) {
        if (argc<2) {
            printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);
            return;
        }
        if (argc>=3) w=atoi(argv[2]);
        if (-1==w) v=1;
        Make_Map(argv[1]);
        Find(0);
    }
    //C:\test>qplw
    //qplw 要产生全排列的字符串 [限定长度|-1]
    //
    //C:\test>qplw 123
    //123
    //132
    //213
    //231
    //312
    //321
    //
    //C:\test>qplw 123 2
    //12
    //13
    //21
    //23
    //31
    //32
    //
    //C:\test>qplw 122333 3
    //122
    //123
    //132
    //133
    //212
    //213
    //221
    //223
    //231
    //232
    //233
    //312
    //313
    //321
    //322
    //323
    //331
    //332
    //333
    //
    //C:\test>qplw 123 -1
    //1
    //12
    //123
    //13
    //132
    //2
    //21
    //213
    //23
    //231
    //3
    //31
    //312
    //32
    //321
    //
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 12月10日