二进制子集题解

二进制子集题解_第1张图片

样例输入:

13

样例输入:

0
1
4
5
8
9
12
13

思路分析:

这道题大体就是进制转换然后按位 d f s dfs dfs。进制转换比较好理解,不懂得可以自行 b d f s ( 百度优先搜索 ) bdfs(百度优先搜索) bdfs(百度优先搜索)一下。

代码:

#include
#include
#include
using namespace std;
set<long long>st;//因为升序输出,所以用set自动排序+去重
string a,str="000000000000000000000000000000000000000000000000000000000000";
long long n;
long long zshi(string s){//二进制转十进制
	long long ans=0;
	for(long long i=0;i<a.size();i++){
		char t=s[i];
		if(t>='0'&&t<='9') ans=ans*2+t-'0';
		else ans=ans*2+t-'a'+10;
	}
	return ans;
}
string zer(long long n){//十进制转二进制
	string ans="";
	do{
		int t=n%2;
		if(t>=0&&t<=9)	ans+=t+'0';
		else ans+=t-10+'a';
		n/=2;
	}while(n!=0);
	reverse(ans.begin(),ans.end());
	return ans;	
}
void dfs(long long x){//x表示二进制第几位
	if(x>=a.size()){
		st.insert(zshi(str));//如果合法,转十进制,放入set
		return;
	}
	if(a[x]=='1'){//如果a[x]是1,str[x]也可以是1
		str[x]='1';
		dfs(x+1);
		str[x]='0';
	}
	dfs(x+1);
	return;
}
int main(){
	cin>>n;
	a=zer(n);//先转二进制
	for(long long i=0;i<a.size();i++){
		str[i]='0';
	}
	dfs(0);
	for(set<long long>::iterator it=st.begin();it!=st.end();it++){
		cout<<*it<<endl;//迭代器遍历输出
	}
	return 0;
}

下一篇:上学

你可能感兴趣的:(个人学习总结,搜索算法,深度优先,算法)