33分,求助

B3623 枚举排列(递归实现排列型枚举)

Eternal_SZC @ 2023-08-01 17:53:52

#include<bits/stdc++.h>
using namespace std;
int n,k,a[105],vis[105],b[105]; 
void dfs(int t){
    if(t>k){
        for(int i=1;i<t;i++){
            printf("%d ",b[i]);
        }
        puts("");
        return ;
    }
    for(int i=1;i<=n;i++){
        if(a[i]==b[t-1]) continue;
        b[t]=a[i];
        dfs(t+1);
        b[t]=0;
    }
}
template <typename TM>
void in(TM &n){
    char c=getchar();
    int f=1;
    while ((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') f=-1, c=getchar();
    for(n=0; c>='0'&&c<='9'; c=getchar()) n=n*10+c-'0';
    n*=f;
}
int main(){
    in(n),in(k);
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    dfs(1);
    return 0;
} 

by I_AK_CTSC @ 2023-08-01 18:01:30

@ahsmile dfs出问题了

a[i]!=b[t-1]你确实筛掉了,但万一a[i]=b[t-2]呢?你这个没筛掉啊……


by I_AK_CTSC @ 2023-08-01 18:02:02

@ahsmile 还是建议写vis标记,用过的标1,没用过的标0


by I_AK_CTSC @ 2023-08-01 18:03:48

@I_AK_APIO 然后路径记录的话单独弄一个,也就是说开两个,一个vis,一个b,然后再写


by I_AK_CTSC @ 2023-08-01 18:08:10

#include <iostream>
#include <cstdio>
using namespace std;
int n,k,a[105],vis[105],b[105]; 
void dfs(int t){
    if(t>k){
        for(int i=1;i<t;i++){
            printf("%d ",b[i]);
        }
        cout << endl;
        return ;
    }
    for(int i=1;i<=n;i++){
        if (vis[a[i]])
        {
            continue;
        }
        vis[a[i]]=1;
        b[t] = a[i];
        dfs(t+1);
        b[t] = 0;
        vis[a[i]]=0;
    }
}
template <typename TM>
void in(TM &n){
    char c=getchar();
    int f=1;
    while ((c>'9' || c<'0') && c!='-') c=getchar();
    if(c=='-') f=-1, c=getchar();
    for(n=0; c>='0'&&c<='9'; c=getchar()) n=n*10+c-'0';
    n*=f;
}
int main(){
    in(n),in(k);
    for(int i=1;i<=n;i++){
        a[i]=i;
    }
    dfs(1);
    return 0;
}

给你改了改,看看能不能看懂


by Eternal_SZC @ 2023-08-01 18:47:11

@I_AK_APIO 看懂了,万分感谢


|