Задача
Одна из базовых задач компьютерной графики – обработка черно-белых изображений. Изображения можно представить в виде прямоугольников шириной $w$ и высотой $h,$ разбитых на $w × h$ единичных квадратов, каждый из которых имеет либо белый, либо черный цвет. Такие единичные квадраты называются пикселами. В памяти компьютера сами изображения хранятся в виде прямоугольных таблиц, содержащих нули и единицы.
Во многих областях очень часто возникает задача комбинации изображений. Одним из простейших методов комбинации, который используется при работе с черно-белыми изображениями, является попиксельное применение некоторой логической операции. Это означает, что значение пиксела результата получается применением этой логической операции к соответствующим пикселам аргументов. Логическая операция от двух аргументов обычно задается таблицей истинности, которая содержит значения операции для всех возможных комбинаций аргументов. Например, для операции «ИЛИ» эта таблица выглядит так.
Напишите программу, которая вычислит результат попиксельного применения заданной логической операции к двум черно-белым изображениям одинакового размера.
Входные данные
Первая строка содержит два целых числа $w$ и $h$ $(1 \leq w, h \leq 100).$ Последующие $h$ строк описывают первое изображение и каждая из этих строк содержит $w$ символов, каждый из которых равен нулю или единице. Далее следует описание второго изображения в аналогичном формате. Последняя строка содержит описание логической операции в виде четырех чисел, каждое из которых – ноль или единица. Первое из них есть результат применения логической операции в случае, если оба аргумента нули, второе – результат в случае, если первый аргумент ноль, второй единица, третье – результат в случае если первый аргумент единица, второй ноль, а четвертый – в случае, если оба аргумента единицы.
Выходные данные
Вывести результат применения заданной логической операции к изображениям в том же формате, в котором изображения заданы во входных данных.
Тесты
Входные данные | Выходные данные | |
---|---|---|
1 | 5 3 01000 11110 01000 10110 00010 10110 0110 |
11110 11100 11110 |
2 | 2 3 010 111 000 101 1010 |
11 10 10 |
3 | 4 4 1111 0101 0000 1110 0011 0101 0111 1111 0011 |
1111 0101 0000 1110 |
4 | 3 6 100011 000111 000000 111011 001100 010101 1000 |
000 100 110 000 101 010 |
Код программы 1
( использован одномерный массив)
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 |
#include <iostream> using namespace std; bool my_operation (bool a, bool b, bool* res) { if (!a and !b) return res[0]; else if (!a and b) return res[1]; else if (a and !b) return res[2]; else return res[3]; } int main() { int w, h, n; bool truth_t[4]; cin >> w >> h; n = w * h; bool *first_t = new bool [n]; bool *second_t = new bool [n]; char c; for (int i = 0; i < n; i++) { cin >> c; first_t[i] = (c == '1' ? true : false); } for (int i = 0; i < n; i++) { cin >> c; second_t[i] = (c == '1' ? true : false); } for (int i = 0; i < 4; i++) { cin >> c; truth_t[i] = (c == '1' ? true : false); } for (int i = 0; i < n; i++) { if (i != 0 && i % w == 0) cout << endl; cout << my_operation(first_t[i], second_t[i], truth_t); } return 0; } |
Код программы 2
(использован двумерный массив)
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 |
#include <iostream> using namespace std; bool my_operation (bool a, bool b, bool* res) { if (!a and !b) return res[0]; else if (!a and b) return res[1]; else if (a and !b) return res[2]; else return res[3]; } int main() { int w, h; bool truth_t[4]; cin >> w >> h; bool **first_t = new bool *[h]; bool **second_t = new bool *[h]; for (int i = 0; i < h; i++) { first_t[i] = new bool [w]; second_t[i] = new bool [w]; } char c; for (int i = 0; i < h; i++){ for (int j = 0; j < w; j++) { cin >> c; first_t[i][j] = (c == '1' ? true : false); } } for (int i = 0; i < h; i++){ for (int j = 0; j < w; j++) { cin >> c; second_t[i][j] = (c == '1' ? true : false); } } for (int i = 0; i < 4; i++) { cin >> c; truth_t[i] = (c == '1' ? true : false); } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cout << my_operation(first_t[i][j], second_t[i][j], truth_t); } if (i < h - 1) cout << endl; } return 0; } |
Решение
Объявляем два булевых динамических массива под две пиксельные таблицы и один статический для таблицы истинности, вводим входные данные. Затем поочерёдно сравниваем соответствующие элементы массивов с помощью функции my_operation, которая принимает две переменные a и b булевского типа и булев массив res с таблицей истинности, и возвращает соответствующее значение из таблицы для комбинации значений a и b. Результат сравнения выводим.
Ссылки
- Одномерный массив
- Двумерный массив
Для отправки комментария необходимо войти на сайт.