大乐透

东北林业大学 OJ 题源

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;
}


你可能感兴趣的:(大乐透)