441. Лото

 

В немецком лото следует выбрать 6 чисел из множества {1, 2, …, 49}. Одна из стратегий игры в лото состоит в том, что выбирается подмножество S Í {1, 2, …, 49}, состоящее из k чисел (k > 6). После чего в течении нескольких игр выбираются числа только из 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,34].

В задаче следует для заданных k и S вывести все возможные наборы из 6 чисел.

 

Вход. Состоит из нескольких строк – тестов. Первым в каждой строке стоит число k (6 < k < 13). Далее следуют k чисел в возрастающем порядке, из которых состоит множество S. Последний тест содержит k = 0 и не обрабатывается.

 

Выход. Для каждого теста вывести все возможные наборы для игры в лото в лексикографическом порядке. Каждый набор должен состоять из чисел, принадлежащих S.

 

Пример входа

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

 

 

РЕШЕНИЕ

перебор

 

Анализ алгоритма

Запомним множество S в массиве. Далее при помощи вложенного 6 раз цикла for перебираем все шестерки множества S.

 

Реализация алгоритма

Читаем число k, заносим элементы множества S в массив m. Перебираем все шестерки чисел, каждое из которых принадлежит S.

 

scanf("%d",&k);

for(;;)

{

  for(i = 1; i <= k; i++) scanf("%d",&m[i]);

  for(i1 = 1; i1 <= k - 5; i1++)

  for(i2 = i1 + 1; i2 <= k - 4; i2++)

  for(i3 = i2 + 1; i3 <= k - 3; i3++)

  for(i4 = i3 + 1; i4 <= k - 2; i4++)

  for(i5 = i4 + 1; i5 <= k - 1; i5++)

  for(i6 = i5 + 1; i6 <= k; i6++)

    printf("%d %d %d %d %d %d\n",m[i1],m[i2],m[i3],m[i4],m[i5],m[i6]);

  scanf("%d",&k);

  if (!k) break; else printf("\n");

}