description |
在小明曾经玩过的一种对号码的纸牌游戏(乐透)里,玩家必须从{1,2,……,49}中选择6个数。玩Lotto的一个流行策略是(虽然它并不增加你赢的机会):就是从这49个数中,选出k(k>6)个数组成一个子集S,然后只从S里拿出牌来玩几局游戏。例如,k=8,s={1,2,3,5,8,13,21,34},那么有28场可能的游戏:[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,24]。
读取数字k和一组数S,输出由S中的数组成的所有可能的游戏。
|
input |
输入数据有多组,每组一行,每行有多个整数,其中第一个整数为数字k,接下来有k个整数,即子集S。当k为0,输入结束。
|
output |
输出由S中的数组成的所有可能的游戏。每种游戏一行。
|
sample_input |
7 1 2 3 4 5 6 7
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
|
废话少说,请看代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int a[49],i,n,b,c,d,e,f;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-5;i++)// 第一个位置输出的数只可能在a[0]~~a[n-6]之间,下面位置的数类似
for(b=i+1;b<n-4;b++)
for(c=b+1;c<n-3;c++)
for(d=c+1;d<n-2;d++)
for(e=d+1;e<n-1;e++)
for(f=e+1;f<n;f++)
printf("%d %d %d %d %d %d\n",a[i],a[b],a[c],a[d],a[e],a[f]);
}
return 0;
}