Региональный этап Всероссийской
олимпиады школьников по информатике 2008/2009 учебного года
Первый тур
Задача 1. Черно-белая графика
| Имя входного файла: | bw.in |
| Имя выходного файла: | bw.out |
| Максимальное время работы на одном тесте: | 2 секунды |
| Максимальный объем используемой памяти: | 64 мегабайта |
Одна из базовых задач компьютерной графики – обработка черно-белых изображений. Изображения можно представить в виде прямоугольников шириной w и высотой h, разбитых на w×h единичных квадратов, каждый из которых имеет либо белый, либо черный цвет. Такие единичные квадраты называются пикселями. В памяти компьютера сами изображения хранятся в виде прямоугольных таблиц, содержащих нули и единицы.
Во многих областях очень часто возникает задача комбинации изображений. Одним из простейших методов комбинации, который используется при работе с черно-белыми изображениями, является попиксельное применение некоторой логической операции. Это означает, что значение пикселя результата получается применением этой логической операции к соответствующим пикселям аргументов. Логическая операция от двух аргументов обычно задается таблицей истинности, которая содержит значения операции для всех возможных комбинаций аргументов. Например, для операции «исключающее ИЛИ» эта таблица выглядит так.
| Первый аргумент | Второй аргумент | Результат |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Требуется написать программу, которая вычислит результат попиксельного применения заданной логической операции к двум черно-белым изображениям одинакового размера.
Формат входных данных
Первая строка входного файла содержит два целых числа w и h (1 ≤ w, h ≤ 100). Последующие h строк описывают первое изображение и каждая из этих строк содержит w символов, каждый из которых равен нулю или единице. Далее следует описание второго изображения в аналогичном формате. Последняя строка входного файла содержит описание логической операции в виде четырех чисел, каждое из которых – ноль или единица. Первое из них есть результат применения логической операции в случае, если оба аргумента – нули, второе – результат в случае, если первый аргумент – ноль, второй – единица, третье – результат в случае, если первый аргумент – единица, второй – ноль, а четвертый – в случае, если оба аргумента – единицы.
Формат выходных данных
В выходной файл необходимо вывести результат применения заданной логической операции к изображениям в том же формате, в котором изображения заданы во входном файле.
Пример входных и выходных данных
| bw.in | bw.out |
|
5 3 |
11110 |
Краткие методические рекомендации по решению задачи
Решение данной задачи в основном заключается в непосредственной аккуратной реализации операции, описанной в условии задачи. Для хранения заданной логической операции можно использовать массив целочисленного типа d[0..1,0..1], элемент которого d[i,j] хранит результат логической операции с первым аргументом i и вторым аргументом j. Таким образом, значение пикселя результата с координатами (x, y) будет равно d[a[x,y],b[x,y]], где a[1..h,1..w] и b[1..h,1..w] – целочисленные матрицы, хранящие исходные изображения.
При реализации решения особое внимание следует уделить этапу считывания исходных изображений и описания логической операции из входного файла, а также выводу результата работы программы в выходной файл.
В чем подвох?
Скажу по секрету, что у меня есть решения задач участников из Волгоградской области, по которым я могу сделать вывод, что многие из них не смогли считать данные из файла bw.in. Обратите внимание, что во входном файле, пробелы между символами есть только в первой строке. Во всех остальных строках, между символами нет пробелов.
Текст программы на Паскале одного из участников олимпиады:
Var
P, Q : array [1..100,1..100] of boolean;
O : array [False..True, False..True] of char;
x, y, w, h : byte;
c : char;
f : text;
begin
Assign(f,'bw.in');
Reset(f);
Readln(f,w,h);
for y:=1 to h do
begin
for x:=1 to w do
begin
read(f,c);
if c='1' then
P[x,y]:=True
else
P[x,y]:=False;
end;
Readln (f);
end;
for y:=1 to h do
begin
for x:=1 to w do
begin
read(f,c);
if c='1' then
Q[x,y]:=True
else Q[x,y]:=False;
end;
Readln (f);
end;
Read(f, O[False,False], O[False,True], O[True,False], O[True,True]);
Close(f);
Assign(f,'bw.out');
Rewrite(f);
for y:=1 to h do
begin
for x:=1 to w do
Write(f, O[P[x,y],Q[x,y]]);
Writeln(f);
end;
Close(f);
end.