题目地址:zoj 1089
题目:就是生成组合。
用dfs来写, 其中“相邻的边”实际上就是每次可以选择把某一位放入输出组中,也可以选择不放进去。 形成一“路径选择二叉树”。
搜到了一条路径就“return” 来回溯
cnt-- 就是把当前节点pass掉了~
代码:
#include<iostream>
#include<vector>
using namespace std;
int p[13];
//int vis[13];
int k;
int cnt=0;
int pout[13];
void dfs(int cur)
{
if(cnt==6)
{
for(int i=0;i<5;i++)
cout<<pout[i]<<" ";
cout<<pout[5]<<endl;
return;
}
if(cur>=k) return ;
pout[cnt++]=p[cur];
dfs(cur+1);
cnt--;
dfs(cur+1);
}
int main()
{
bool flag=0;
while(cin>>k)
{
if(k==0) break;
if(flag) cout<<endl;
if(!flag) flag=1;
for(int i=0;i<k;i++)
{
cin>>p[i];
}
dfs(0);
}
}