社区讨论
全排列如何用DFS解决
灌水区参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lxixno9p
- 此快照首次捕获于
- 2024/06/17 20:09 2 年前
- 此快照最后确认于
- 2024/06/17 20:13 2 年前
rt.
全排列:不知道的上网查。答案要按从小到大的顺序输出,要去重。
CPP输出:
231
输入:
123
132
213
231
312
321
看着我的这个数据理解一下
我不想用 next_permutation 或其他的函数实现,我只想用 的方式。
我试了一下,我用的是普通的枚举排列加上一个类似于桶的二维数组实现的去重。
可以看到我的去重复杂度应该是 ,当 的时候,,这个复杂度加上枚举所有排列的复杂度完全超了。
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
ll a[20],n,vis[20],b[20],cnt,ans[4680000][20];
void dfs(ll step){
if(step==n+1){
bool flagg=false;
for(int i=1;i<=cnt;i++){
bool flag=false;
for(int j=1;j<=n;j++)
if(a[j]!=ans[i][j]){
flag=true;
break;
}
if(flag==false){
flagg=true;
break;
}
}if(flagg==false){
cnt++;
for(int j=1;j<=n;j++) ans[cnt][j]=a[j];
for(int j=1;j<=n;j++) cout<<a[j];
cout<<endl;
}
}for(int i=1;i<=n;i++){
if(vis[i]==0){
a[step]=b[i];
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main(){
cin>>s;
for(int i=0;i<s.size();i++) b[i+1]=s[i]-'0';
n=s.size();
sort(b+1,b+n+1);
dfs(1);
return 0;
}
我也想到过把去重放到 外面去实现,但是我不会二维数组按照第二维排序。
请问有什么解决的办法?
回复
共 0 条回复,欢迎继续交流。
正在加载回复...