Рано утром Вася решил сделать домашнее задание по информатике. Начать выполнение задания Вася решил с поиска подходящей тетрадки. Добравшись до ящика с чистыми тетрадями, он открыл одну из них. Вася ещё не до конца и поэтому видит только часть тетрадки и не может сообразить, какая это тетрадка: в клетку, в линейку или в вертикальную линейку ему это сделать.
Формально, дана двухмерная таблица из нулей и единиц — часть тетрадки, которую видит Вася. Единицей обозначается закрашенный участок, а нулем — незакрашенный. Назовём вертикальной линией столбец таблицы, все элементы которого — единицы, а горизонтальной линией — строку таблицы, все элементы которой — единицы. Гарантируется, что каждая единица в таблице содержится в какой-либо линии.
Тетрадкой в клетку называется тетрадка, в которой содержатся вертикальные и горизонтальные линии. Тетрадкой в линейку называется тетрадка, в которой содержатся только горизонтальные линии. Тетрадкой в вертикальную линейку называется тетрадка, в которой содержатся только вертикальные линии.
Известно, что в целой тетрадке все расстояния между линиями одинаковы (то есть все клетки — квадраты, все линейки одинаковой ширины). Гарантируется, что линии не могут располагаться рядом (между ними всегда есть промежуток).
Вам требуется написать программу, которая определит тип тетрадки или скажет, что это невозможно однозначно сделать по данной таблице.
Формат входных данных
В первой строке входных данных даны целые числа n и m (1≤n,m≤1000) — количество строк и столбцов в таблице. Следующие n строк по m чисел содержат целые числа ai,j (0≤ai,j≤1) — элементы таблицы, задающие видимую часть тетради.
const
n=5;
var
a:array[1..n,1..n] of integer;
x:array[1..n] of double;
i,j,k:byte;
begin
Randomize;
Writeln('*** Исходный массив ***');
for i:=1 to n do begin
for j:=1 to n do begin
a[i,j]:=Random(51)-25;
Write(a[i,j]:4)
end;
Writeln
end;
Writeln('*** Массив x ***');
for j:=1 to n do begin
x[j]:=0; k:=0;
for i:=1 to n do
if a[i,j] mod 2=0 then begin
x[j]:=x[j]+a[i,j]; Inc(k)
end;
if k>0 then x[j]:=x[j]/k;
Write(x[j]:0:5,' ')
end;
Writeln
end.
Тестовое решение:
*** Исходный массив ***
-10 18 -8 -15 5
-21 -18 6 -2 9
-7 22 -4 3 14
21 16 -10 -18 -9
17 3 -14 -18 12
*** Массив x ***
-10.00000 9.50000 -6.00000 -12.66667 13.00000
// PascalABC.Net 3.0, сборка 1066
procedure CheckString(var s:string; var n:integer);
var
i:integer;
begin
i:=Length(s);
while i>0 do begin
if not(s[i] in ['a'..'z']) then Delete(s,i,1);
Dec(i)
end;
n:=Length(s)
end;
var
s1,s2:string;
i,p,n1,n2:integer;
begin
Write('Введите первую строку: '); Readln(s1);
CheckString(s1,n1);
if n1=0 then Writeln('Введенная строка не содержит допустимых символов')
else begin
Write('Введите вторую строку: '); Readln(s2);
CheckString(s2,n2);
if n2=0 then Writeln('Введенная строка не содержит допустимых символов')
else
{ теперь обе строки содержат только маленькие латинские буквы }
if n1=n2 then begin
for i:=1 to n1 do begin
p:=Pos(s1[i],s2);
if p=0 then Break
else Delete(s2,p,1)
end;
if Length(s2)=0 then Writeln('Решение имеется')
else Writeln('Решения нет')
end
else
Writeln('Решения нет');
end
end.
Тестовое решение:
Введите первую строку: this is my own deal!
Введите вторую строку: Тест: *is now=l2ead my sthi?
Решение имеется
Также имеется современное решение, которому пока что в школах не учат:
// PascalABC.Net 3.0, сборка 1066
begin
var s1:=ReadString('Введите первую строку: ').Where(x->x in ['a'..'z']);
if s1.Count=0 then
Writeln('Введенная строка не содержит допустимых символов')
else begin
var s2:=ReadString('Введите вторую строку: ').Where(x->x in ['a'..'z']);
if s2.Count=0 then
Writeln('Введенная строка не содержит допустимых символов')
else
if s1.Except(s2).Count>0 then Writeln('Решения нет')
else Writeln('Решение имеется')
end
end.