|
Табло
(Время: 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');
| |