题目描述
求集合的所有划分,集合从文件set.in
中读取,结果输出到标准输出中。
输入样例
输入示例: a b c 输出示例: {{a,b,c}} {{a,b},{c}} {{a,c},{b}} {{a},{b,c}} {{a},{b},{c}}
解题思路
采用二维容器 vector<vector<int>> ans 来存储各个集合,使用dfs ( ) 和回溯的方法,每次回溯时选择加入现有的集合或者自创一个集合。
s保存字符集,ans保存集合
单独将dfs函数列出分步解析:
void dfs(int num)
{
if(num==s.size())//dfs出口
{
print();//输出ans
return;
}
for(int i=0;i<ans.size();i++)
{
ans[i].push_back(s[num]);//将s[num]加入到第i个集合中
dfs(num+1);
ans[i].pop_back();//回溯
}
vector<char> temp;
temp.push_back(s[num]);
ans.push_back(temp);//将s[num]单独列个集合
dfs(num+1);
ans.pop_back();
}
1 2
3 4
5
6
7
8
详细代码
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
vector<char> s;
vector< vector<char> > ans;
void print( )//输出ans集合
{
cout<<"{";
bool flag1=0;
for(int i=0;i<ans.size();i++)
{
if(flag1) cout<<",";
cout<<"{";
bool flag2=0;
for(int j=0;j<ans[i].size();j++)
{
if(flag2) cout<<",";
cout<<ans[i][j];
flag2=1;
}
cout<<"}";
flag1=1;
}
cout<<"}"<<endl;
}
void dfs(int num)
{
if(num==s.size())//dfs出口
{
print();//输出ans
return;
}
for(int i=0;i<ans.size();i++)
{
ans[i].push_back(s[num]);//将s[num]加入到第i个集合中
dfs(num+1);
ans[i].pop_back();//回溯
}
vector<char> temp;
temp.push_back(s[num]);
ans.push_back(temp);//将s[num]单独列个集合
dfs(num+1);
ans.pop_back();
}
int main()
{
ifstream inf("set.in");
char x;
while(inf>>x)
{
s.push_back(x);//将字符串输入进s中
}
dfs(0);
return 0;
}