На хоккейном стадионе в одном большом городе расположено большое прямоугольное табло. Оно имеет n строк и m столбцов (то есть состоит из n * m ячеек). Во время хоккейного матча это табло служит для отображения счета и времени, а в перерывах на нем показывают различную рекламу.
В связи с этим возникла задача проверки возможности показа на этом табло определенной рекламной заставки. Заставка также, как и табло, имеет размер n строк на m столбцов. Каждая из ячеек заставки окрашена в один из четырех цветов: красный — R, зеленый — G, синий — B и черный — . (точка).
Каждая из ячеек табло характеризуется своими цветопередающими возможностями. Любая из ячеек табло может отображать черный цвет — это соответствует тому, что на нее вообще не подается напряжение. Также каждая из ячеек может отображать несколько различных множеств основных цветов. В этой задаче эти подмножества будут кодироваться следующим образом:
Напишите программу, которая по описанию табло и заставки определяет: возможно ли на табло отобразить эту заставку.
Первая строка входного файла INPUT.TXT содержит целые числа n и m (1 ≤ n, m ≤ 100). Далее идут n строк по m символов каждая — описание заставки. Каждый из символов описания заставки принадлежит множеству {R, G, B, .}.
После этого идет описание табло. Оно содержит n строк по m чисел, разделенных пробелами. Значения чисел описаны выше.
В выходной файл OUTPUT.TXT выведите YES, если на табло возможно отобразить заставку и NO в противном случае.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; // Функция для проверки, можно ли отобразить заставку на табло bool canDisplay(const vector<string>& screen, const vector<vector<int>>& display, int n, int m) { for (int i = 0; i < n; ++i) { // Проходим по каждой строке for (int j = 0; j < m; ++j) { // Проходим по каждому столбцу char pixel = screen[i][j]; // Получаем текущий пиксель заставки int capabilities = display[i][j]; // Получаем возможности отображения текущей ячейки табло // Проверка, можно ли отобразить текущий пиксель заставки в текущей ячейке табло if (pixel == 'R') { // Если пиксель красный if (capabilities != 4 && capabilities != 5 && capabilities != 6 && capabilities != 7) { return false; // Если ячейка табло не может отобразить красный, возвращаем false } } else if (pixel == 'G') { // Если пиксель зеленый if (capabilities != 2 && capabilities != 3 && capabilities != 6 && capabilities != 7) { return false; // Если ячейка табло не может отобразить зеленый, возвращаем false } } else if (pixel == 'B') { // Если пиксель синий if (capabilities != 1 && capabilities != 3 && capabilities != 5 && capabilities != 7) { return false; // Если ячейка табло не может отобразить синий, возвращаем false } } // Для пикселя '.' никакая проверка не нужна, всегда правильно } } return true; // Если все пиксели могут быть отображены правильно, возвращаем true } int main() { ifstream inputFile("INPUT.TXT"); // Открываем входной файл ofstream outputFile("OUTPUT.TXT"); // Открываем выходной файл if (!inputFile.is_open()) { cerr << "Не удалось открыть входной файл!" << endl; // Если файл не удалось открыть, выводим сообщение об ошибке return 1; // Завершаем программу с ошибкой } int n, m; inputFile >> n >> m; // Считываем размеры табло vector<string> screen(n); // Создаем вектор строк для заставки for (int i = 0; i < n; ++i) { inputFile >> screen[i]; // Считываем строки заставки из файла } vector<vector<int>> display(n, vector<int>(m)); // Создаем вектор векторов для возможностей табло for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { inputFile >> display[i][j]; // Считываем возможности каждой ячейки табло } } inputFile.close(); // Закрываем входной файл if (canDisplay(screen, display, n, m)) { // Проверяем, можно ли отобразить заставку outputFile << "YES" << endl; // Если можно, выводим "YES" } else { outputFile << "NO" << endl; // Если нельзя, выводим "NO" } outputFile.close(); // Закрываем выходной файл return 0; // Завершаем программу } |
Объяснение кода на C++
Этот код проверяет, можно ли отобразить заданную заставку на табло, учитывая возможности цветопередачи ячеек табло.
Шаги выполнения кода
1. Открытие входного и выходного файлов:
|
ifstream inputFile("INPUT.TXT"); // Открываем входной файл ofstream outputFile("OUTPUT.TXT"); // Открываем выходной файл |
Эти строки открывают файл INPUT.TXT
для чтения и файл OUTPUT.TXT
для записи.
2. Проверка ошибки открытия файла:
|
if (!inputFile.is_open()) { cerr << "Не удалось открыть входной файл!" << endl; // Если файл не удалось открыть, выводим сообщение об ошибке return 1; // Завершаем программу с ошибкой } |
Эти строки проверяют, успешно ли открылся входной файл. Если файл не удалось открыть, выводится сообщение об ошибке, и программа завершает работу.
3. Чтение размеров табло:
|
int n, m; inputFile >> n >> m; // Считываем размеры табло |
Эти строки читают размеры табло (количество строк n
и количество столбцов m
).
4. Чтение строки заставки:
|
vector<string> screen(n); // Создаем вектор строк для заставки for (int i = 0; i < n; ++i) { inputFile >> screen[i]; // Считываем строки заставки из файла } |
Эти строки читают каждую строку заставки и сохраняют их в векторе screen
.
5. Чтение возможностей табло:
|
vector<vector<int>> display(n, vector<int>(m)); // Создаем вектор векторов для возможностей табло for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { inputFile >> display[i][j]; // Считываем возможности каждой ячейки табло } } |
Эти строки читают возможности каждой ячейки табло и сохраняют их в матрице display
.
6. Закрытие входного файла:
|
inputFile.close(); // Закрываем входной файл |
Эта строка закрывает входной файл.
7. Проверка возможности отображения заставки:
|
if (canDisplay(screen, display, n, m)) { // Проверяем, можно ли отобразить заставку outputFile << "YES" << endl; // Если можно, выводим "YES" } else { outputFile << "NO" << endl; // Если нельзя, выводим "NO" } |
Эти строки проверяют, можно ли отобразить заставку на табло, используя функцию canDisplay
. Если можно, выводится «YES», иначе «NO».
8. Закрытие выходного файла:
|
outputFile.close(); // Закрываем выходной файл |
Эта строка закрывает выходной файл.
9. Завершение программы:
|
return 0; // Завершаем программу |
Эта строка завершает программу с кодом завершения 0, что означает успешное выполнение.