社区讨论

全排列如何用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 或其他的函数实现,我只想用 DFSDFS 的方式。
我试了一下,我用的是普通的枚举排列加上一个类似于桶的二维数组实现的去重。
可以看到我的去重复杂度应该是 O(cntn)O(cnt*n),当 n=10n=10 的时候,cnt=3628800cnt=3628800,这个复杂度加上枚举所有排列的复杂度完全超了。
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;
}
我也想到过把去重放到 DFSDFS 外面去实现,但是我不会二维数组按照第二维排序。
请问有什么解决的办法?

回复

0 条回复,欢迎继续交流。

正在加载回复...