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 看懂了,万分感谢