1073 - 彩票

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

有一种彩票的玩法是从1~49这49个整数中挑选6个数字。小明为此研究出一个选号的策略,就是从这49个数字中选出一个子集S,S中包含了k(k>6)个数字,然后从S中再选择6个数字作为最终选定的号码。
你的任务是,给你k和集合S,输出从S中选择投注号码的所有组合。

题目输入

输入包含多组测试数据。每组输入首先是一个整数k(6<k<13)。然后是k个整数,表示集合S,这k个整数按升序给出。当k=0时,输入结束。

题目输出

对于每组输入,输出所有的投注组合,每行一种,每种按照号码升序排列,所有组合按照字典序升序排列。
每两组输出之间输出一个空行。

输入/输出样例

输入格式

7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0

输出格式

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

C语言解答

#include<stdio.h>

int main()
{
	int k,n[13],i,t=0,a,b,c,d,e,f;
	while(scanf("%d",&k)!=EOF,k)
	{
		if(t++)
			puts("");
		for(i=0;i<k;i++)
			scanf("%d",&n[i]);
		for(a=0;a<k-5;a++)
			for(b=a+1;b<k-4;b++)
				for(c=b+1;c<k-3;c++)
					for(d=c+1;d<k-2;d++)
						for(e=d+1;e<k-1;e++)
							for(f=e+1;f<k;f++)
								printf("%d %d %d %d %d %d\n",n[a],n[b],n[c],n[d],n[e],n[f]);
	}
	return 0;
}

C++解答

#include<stdio.h>

int main()
{
	int k,n[13],i,t=0,a,b,c,d,e,f;
	while(scanf("%d",&k)!=EOF,k)
	{
		if(t++)
			puts("");
		for(i=0;i<k;i++)
			scanf("%d",&n[i]);
		for(a=0;a<k-5;a++)
			for(b=a+1;b<k-4;b++)
				for(c=b+1;c<k-3;c++)
					for(d=c+1;d<k-2;d++)
						for(e=d+1;e<k-1;e++)
							for(f=e+1;f<k;f++)
								printf("%d %d %d %d %d %d\n",n[a],n[b],n[c],n[d],n[e],n[f]);
	}
	return 0;
}

Java解答

import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int count=0;
		while(in.hasNextInt()){
			int n = in.nextInt();
			if(n==0)
				break;
			if(count++>0)
				System.out.println();
			boolean[] vis = new boolean[n];
			int[] a = new int[n];
			for(int i=n-1;i>=0;i--){
				a[i]=in.nextInt();
			}
			com(vis,a,n,6);
		}
	}

	public static void com(boolean[] vis, int[] a, int n, int m) {
		if (n < m)
			return;
		if (m == 0) {
			print(vis, a);
			return;
		}
		vis[n - 1] = true;
		com(vis, a, n - 1, m - 1);
		vis[n - 1] = false;
		com(vis, a, n - 1, m);
	}

	public static void print(boolean[] vis, int[] a) {
		int count = 0;
		for (int i = a.length-1; i>=0;i--) {
			if (vis[i] == true) {
				count++;
				if (count == 6)
					System.out.println(+a[i]);
				else
					System.out.print(a[i] + " ");
			}
		}
	}
}

Python解答

def space_input(p=''):
    s=raw_input(p).split()
    for i in range(len(s)):
        s[i]=eval(s[i])
    return tuple(s)
s=space_input()[1:]
while s!=():
    l=len(s)
    a=[0,1,2,3,4,5]
    while True:
        for i in range(6):
            print s[a[i]],
        print
        if a[5]<l-1:
            a[5]+=1
        elif a[4]<l-2:
            a[4]+=1
            a[5]=a[4]+1
        elif a[3]<l-3:
            a[3]+=1
            a[4]=a[3]+1
            a[5]=a[4]+1
        elif a[2]<l-4:
            a[2]+=1
            a[3]=a[2]+1
            a[4]=a[3]+1
            a[5]=a[4]+1
        elif a[1]<l-5:
            a[1]+=1
            a[2]=a[1]+1
            a[3]=a[2]+1
            a[4]=a[3]+1
            a[5]=a[4]+1
        elif a[0]<l-6:
            a[0]+=1
            a[1]=a[0]+1
            a[2]=a[1]+1
            a[3]=a[2]+1
            a[4]=a[3]+1
            a[5]=a[4]+1
        else:
            break
    print
    s=space_input()[1:]