Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки

HotLog


 

Табло

(Время: 1 сек. Память: 16 Мб Сложность: 20%)

Здесь необходимо использовать некоторый двумерный массив символов A[i][j] для запоминания информации, которую необходимо отбразить на табло. Проще всего использовать для этой цели одномерный массив строк. Здесь можно обойтись без массива для хранения возможностей табло. Сначала нужно считать данные о рекламной заставке в массив A, а затем пробегая по цветопередаточным возможностям табло можно каждую ячейку просто сравнивать с соответствующей ячейкой массива A и анализировать возможность ее отображения. В том случае, когда окажется, что в текущей ячейке информация не может быть отражена, то следует прекратить поиск и вывести NO. Если же такого случая не представится, то по завершении просмотра всех ячеек следует вывести YES.

Остается лишь понять: как определить, может ли цвет C быть отражен в ячейке с цветопередаточной возможностью K. Можно конечно просто рассмотреть каждый возможный случай для C согласно представленной таблице в формулировке задачи:

С='.'. Черный цвет мы можем вывести в любом случае.

С='R'. Красный цвет возможен лишь тогда, когда K больше, чем 3. В противном случае отобразить красный цвет не предосталяется возможным.

С='G'. Зеленый цвет возможен лишь при K=2,3,6,7.

С='B'. Синий цвет возможен лишь при K=1,3,5,7 или проще говоря, когда K - нечетно.

При такой проверке используется много условий. Можно заметить, что значение цветопередаточности в двоичной записи устроено таким образом, что 0й бит отвечает за синий цвет, 1й бит за зеленый и 2й - за красный. Тогда с помощью логической операции and можно проверить возможность использования какого-либо цвета. Например, если 1 and K > 0, то для K возможно отобразить синий цвет, если же 2 and K > 0, то можно отобразить зеленый, для красного же цвета должно выполняться 4 and K > 0. Для простоты можно определить массив C[T], аргументом которого будет цвет, а значением то число, которое необходимо использовать в операции and (конъюнкция, в языке Си это &). Таким образом, в дальнейшем для цвета T достаточно будет проверить значение C[T] and K (кроме черного цвета).

Реализация вышеописанного может быть представлена следующим образом на нашем алгоритмическом языке:

  String A[1..100];
  int C['.','B','G','R']={0,1,2,4};

  read(n,m);

  for i=1..n{ 
    read(A[i]);
  }

  for i=1..n{
    for j=1..m{
      read(K);
      if A[i][j]<>'.' and (C[A[i][j]] and K = 0) {
        write('NO');
        exit;
      }
    }
  }

  write('YES');

[Обсуждение] [Все попытки] [Задача]

Красноярский краевой Дворец пионеров, (c)2006 - 2021, E-mail: admin@acmp.ru