10978. Давайте поиграем в магию!

 

Рассмотрим карточную игру под названием “Говорящая пчела”. Маг располагает n карт по кругу. Начиная с некоторой позиции, он произносит: A – C – E. Открывает позицию “E”, а там – туз. Туз из круга выбрасывается, далее маг произносит:  T – W – O. Открывается карта в позиции “O”, а там – двойка. И так далее пока все карты не будут выброшены. Зная произносимые слова, следует определить первоначальное положение карт.

 

Вход. Состоит из нескольких тестов. Первая строка каждого теста содержит число карт n (1 £ n £ 52 ). Следующие n строк содержат карты, последовательно открываемые магом, и слова, которые он при этом говорит. Карта кодируется двумя буквами: значением и мастью. Длины произносимых слов не более 20. Последний тест содержит n = 0 и не обрабатывается.

 

Выход. Для каждого теста вывести расположение карт, начиная с точки отсчета.

 

Пример входа

13

AS ACE

2S TWO

3S THREE

4C FOUR

5C FIVE

6C SIX

7D SEVEN

8D EIGHT

9D NINE

TH TEN

JH JACK

QH QUEEN

KH KING

0

 

Пример выхода

QH 4C AS 8D KH 2S 7D 5C TH JH 3S 6C 9D

 

 

РЕШЕНИЕ

моделирование

 

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

В задаче следует произвести моделирование игры. Начав с нулевой позиции, будем произносить первое слово. Если его длина равна len, то на позиции len устанавливаем карту, которая ему соответствует. Далее произносим второе слово. Двигаясь по кругу, подсчитываем только пустые позиции (позиции, в которых уже расположены карты, пропускаем). Процесс повторяем до тех пор пока все n карт не будут расположены в массиве res длины n.

 

Пример

Первое слово ACE содержит три буквы. Положим res[2] = “AS”. Следующее слово TWO содержит три буквы, присвоим res[5] = “2S”. Третья карта 3S будет расположена в позиции 5 + |THREE| = 5 + 5 = 10. Процесс продолжается до тех пор, пока все карты не займут своего места.

 

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

В массиве res храним карты. В массив card будем считывать очередную карту, word – слово, которое при этом произносится.

 

char res[53][3];

char card[3], word[21];

 

Читаем количество карт n. Обнулим массив res.

 

while(scanf("%d",&n),n)

{

  memset(res,' ',sizeof(res));

  ptr = -1;

 

Читаем пару (карта, слово) и находим длину слова len = |word|. Циклически двигаемся вперед на len символов, подсчитывая при этом только не занятые позиции (для которых res[ptr][0] == ' '). После нахождения требуемой позиции ptr, копируем в нее карту командой strcpy.

 

  for(i = 0; i < n; i++)

  {

    scanf("%s %s",card,word);

    len = strlen(word);

    while(len)

    {

      ptr++;

      if (ptr >= n) ptr = 0;

      if (res[ptr][0] == ' ') len--;

    }

    strcpy(res[ptr],card);

  }

 

Выводим требуемую последовательность карт. После вывода последней карты не должно быть лишних пробелов.

 

  printf("%s",res[0]);

  for(i = 1; i < n; i++)

    printf(" %s",res[i]);

  printf("\n");

}