Черно-белая графика
Региональный этап Всероссийской
олимпиады школьников по информатике 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
01000
11110
01000
10110
00010
10110
0110
|
11110
11100
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.
[к
списку задач]
|