In a Lotto I have ever played, one has to select 6 numbers from the set {1,2,...,49}. A popular strategy to play Lotto - although it doesn't increase your chance of winning - is to select a subset S containing k (k>6) of these 49 numbers, and then play several games with choosing numbers only from S. For example, for k=8 and S = {1,2,3,5,8,13,21,34} there are 28 possible games: [1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ... [3,5,8,13,21,34].
Your job is to write a program that reads in the number k and the set S and then prints all possible games choosing numbers only from S.
Input Specification
The input file will contain one or more test cases. Each test case consists of one line containing several integers separated from each other by spaces. The first integer on the line will be the number k (6 < k < 13). Then k integers, specifying the set S, will follow in ascending order. Input will be terminated by a value of zero (0) for k.Output Specification
For each test case, print all possible games, each game on one line. The numbers of each game have to be sorted in ascending order and separated from each other by exactly one space. The games themselves have to be sorted lexicographically, that means sorted by the lowest number first, then by the second lowest and so on, as demonstrated in the sample output below. The test cases have to be separated from each other by exactly one blank line. Do not put a blank line after the last test case.Sample Input
7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0
Sample Output
1 2 3 4 5 6 1 2 3 4 5 7 1 2 3 4 6 7 1 2 3 5 6 7 1 2 4 5 6 7 1 3 4 5 6 7 2 3 4 5 6 7 1 2 3 5 8 13 1 2 3 5 8 21 1 2 3 5 8 34 1 2 3 5 13 21 1 2 3 5 13 34 1 2 3 5 21 34 1 2 3 8 13 21 1 2 3 8 13 34 1 2 3 8 21 34 1 2 3 13 21 34 1 2 5 8 13 21 1 2 5 8 13 34 1 2 5 8 21 34 1 2 5 13 21 34 1 2 8 13 21 34 1 3 5 8 13 21 1 3 5 8 13 34 1 3 5 8 21 34 1 3 5 13 21 34 1 3 8 13 21 34 1 5 8 13 21 34 2 3 5 8 13 21 2 3 5 8 13 34 2 3 5 8 21 34 2 3 5 13 21 34 2 3 8 13 21 34 2 5 8 13 21 34 3 5 8 13 21 34
Source: University of Ulm Local Contest 1996
又是一个排列组合 不同的是是按从小到大的顺序进行排列 这道题在上午最后的时候做的 脑袋一片混乱 下午重新敲了一遍 三次PE后终于过了
这题有个陷阱 就是最后一组数据不能有空行 两组数据之间有空行 所以每次读取下组数据的时候 先输出一组空行
同样 因为数据是从小到大进行排列的 依旧不需要vis进行标记 (当然标记也行) ,因为其前面选择的数据不会影响到后面
code:
#include<iostream>
#include<string.h>
using namespace std;
int a[10000];
int n;
int num[10000];
void dfs(int sta,int cur)
{
if(cur>6)
return ;
for(int i=sta;i<=n;i++)
{
num[cur]=a[i];
if(cur==6)
{
for(int j=1;j<=6;j++)
{
cout<<num[j];
if(j!=6)
cout<<" ";
}
cout<<endl;
}
dfs(i+1,cur+1); //这个地方纠结了好久 上午就是在这里混乱了 一个记录最小值 一个记录输出数组的下标
}
}
int main()
{
int T=0;
while(1)
{
cin>>n;
if(n==0) break;
if(T!=0)
cout<<endl;//地方就是在这个地方先输出一个空行 (其实还是不明白 既然读了数据 那这个空行应该在第一个数之前 。。。。。)
T++;
memset(a,0,sizeof(a));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(1,1);
//cout<<endl;
}
return 0;
}
当然也可以用vis进行标记。。。。。。
code:
#include<iostream>
#include<string.h>
using namespace std;
int a[10000];
int n;
int num[10000];
int vis[10000];
void dfs(int sta,int cur)
{
if (cur>6)
return ;
for (int i=sta;i<=n;i++)
{
if (!vis[i])
{
vis[i]=1;
num[cur]=a[i];
if (cur==6)
{
for (int j=1;j<=6;j++)
{
cout<<num[j];
if (j!=6)
cout<<" ";
}
cout<<endl;
}
dfs(i+1,cur+1);
vis[i]=0;
}
}
}
int main()
{
int T=0;
while (1)
{
cin>>n;
if (n==0) break;
if (T!=0)
cout<<endl;
T++;
memset(a,0,sizeof(a));
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
dfs(1,1);
//cout<<endl;
}
return 0;
}