救救孩子吧
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/4/24 20:49
  • 上次更新2024/4/25 11:04:08
查看原帖
救救孩子吧
1246532
封禁用户楼主2024/4/24 20:49

问题描述

读入一个整数 ,用其各位数字生成全排列,把重复出现的去掉,并且按从小到大的顺序输出。

样例输入

  • 231

样例输出

  • 123
  • 132
  • 213
  • 231
  • 312
  • 321

大佬帮忙改成位运算方法目前超时

#include<bits/stdc++.h>
using namespace std;
long long n,b[10000],vis[10000],a[10000],cnt=0;
string k[10000];
bool find(string s){
	for(int i=1;i<=cnt;i++){
		if(k[i]==s){
			return 1;
		}
	}
	return 0; 
}
int dfs(long long cur){
	//cout<<cur<<endl;
	if(cur>n){
		string s;
		for(int i=1;i<=n;i++){
			s+=b[i];
		}
		if(find(s)==1){
			return 0;
		}else{
			cnt++;
			k[cnt]=s;
			for(int i=1;i<=n;i++){
				cout<<b[i];
			}
		}
		
		cout<<endl;
		return 0;
		
	}
	
	for(int i=1;i<=n;i++){
		//cout<<"cur "<<b[cur]<<" "<<a[i]<<endl; 
		if(vis[i]==0){	
			b[cur]=a[i];
			vis[i]=1;
			dfs(cur+1);
			vis[i]=0;
		}
	}
	
} 
int main(){
	string k;
	cin>>k;
	n=k.size(); 
	for(int i=0;i<n;i++){
		a[i+1]=k[i]-'0';
	}
	sort(a+1,a+n+1);
	dfs(1);
	

    return 0;
}

2024/4/24 20:49
加载中...