Помощь - Поиск - Пользователи - Календарь
Полная версия: Черно-белые деревья
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Слай
Требуется написать программу перевода изображения в строку чисел и обратного преобразования — строки чисел в изображение.

Входные данные

Файл содержит описание одного или нескольких изображений. Все изображения — это квадратные рисунки, длины сторон квадратов — целые числа, являющиеся степенями двойки. Входной файл начинается с целого числа n, где |n| — длина стороны квадрата (|n| < 64). Если число n больше 0, то затем следует |n| строк по |n| знаков в строке, заполненных 0 и 1. При этом 1 соответствует черному цвету. Если n меньше 0, то затем следует описание изображения в виде строки из десятичных чисел, оканчивающейся -1. Полностью черному квадрату соответствует строка из одного 0. Белый квадрат кодируется пустой строкой (ничего не вводится). Признаком конца входного файла является значение n, равное 0.

Выходные данные

Для каждого изображения из входного файла выводится его номер. В том случае, когда изображение задается с помощью 0 и 1, в выходной файл записывается его представление в виде строки десятичных чисел. Числа в строке сортируются в порядке возрастания. Для изображений, содержащих больше 12 черных областей, после каждых 12 чисел вывод начинается с новой строки. Количество черных областей выводится после строки из десятичных чисел. В том случае, когда изображение задается строкой из десятичных чисел, в выходной файл записывается его представление в виде квадрата, в котором символ ‘.’ соответствует 0, а символ ‘*’ — 1. Пример входного и выходного файлов приведен в таблице.


Входной файл Выходной файл
===============================================================
8 Изображение 1
0 0 0 0 0 0 0 0 9 14 17 22 23 44
0 0 0 0 0 0 0 0 63 69 88 94 113
0 0 0 0 1 1 1 1 Общее число черных областей 11
0 0 0 0 1 1 1 1
0 0 0 1 1 1 1 1
0 0 1 1 1 1 1 1
0 0 1 1 1 1 0 0
0 0 1 1 1 0 0 0
===============================================================
-8 Изображение 2
. . . . . . . .
9 14 17 22 23 44 . . . . . . . .
63 69 88 94 113 -1 . . . . * * * *
. . . . * * * *
. . . * * * * *
. . * * * * * *
. . * * * * . .
. . * * * . . .

================================================================
2 Изображение 3
0 0 Общее число черных областей 0
0 0
================================================================
-4 Изображение 4
0 -1 * * * *
* * * *
* * * *
* * * *
================================================================



Вот мои попытки:


Program Black_White_Trees;

{type SolveA = procedure;}
{type SolveB = procedure;}
Var N, NumTest: integer;
{Cp -- massiv, opisyvayuw'ij izobrazhenie}

Var A : Array [1..64, 1..64] of integer;

{===================== CHTENIE MASSIVA =====================}
Procedure ReadA;
Var i,j: integer;
Var N,M: integer;
BEGIN
{Assign(Input,'Input.txt'); Reset(Input);}
for i:=1 to N do
for j:=1 to M do
begin
Read(A[i,j])
end;
{Close(Input);}
END;

Procedure PrintA;
Var i,j: integer;
Var N,M: integer;
BEGIN
for i:=1 to N do
for j:=1 to M do
begin
Write(A[i,j])
end;
END;

Procedure PrintB;
Var i,j: integer;
Var N,M: integer;
BEGIN
for i:=1 to N do
for j:=1 to M do
begin
Write(A[i,j])
end;
END;

Function RecA(i,j,d:integer;Way:string):boolean;
var k:integer; c:boolean;
begin
if d=1 then c:=A[i,j]
else begin k:=d div 2;
c:=RecA(i,j,k,'1'+Way) and
RecA(i,j+k,k,'2'+Way) and
RecA(i+k,j,d,'3'+Way) and
RecA(i+k,j+k,d,'4'+Way);
IF c then Dec(Cnt,4);
END;
if c then begin Inc(Cnt) ;
Cp[Cnt]:=<Bygaga>
end;
RecA:=c;
End;

{SORTIROVKA_MASSIVA}
Procedure Sort(num: integer);
var V: array [1..64] of integer;
Var i,j,x: integer;
begin
for i:=2 to num do begin
x:=V[i];
j:=i;
while((x<V[j-1])and(j>0)) do begin
V[j]:=V[j-1];
j:=j-1;
end;
V[j]:=x;
end;
end;

Procedure SolveA;
Var i,Cnt:integer;
BEGIN
ReadA; {Chtenie isxodnogo massiva iz fajla}
Cnt:=0;
IF RecA(1,1,N,'') then begin Cnt:=1;
Cp[Cnt]:=0; end;
Sort;
PrintA;
END;

Function Fr5To10(S:String):LongInt;
Var Res:LongInt;
i:integer;
begin
Res:=0;
For i:=1 to Length(S) do
Res:=Res*5+Ord(S[i])-Ord('0');
Fr5To10:=Res;
End;

Procedure SolveB;
Var i:LongInt;
Begin
FillChar(A,SizeOf(A),False);
Read(i);
While i<>-1 Do Begin
RecB(1,1,-N,Fr10To5(i));
Read(i);
End;
PrintB;
End;

Function Fr10ToB(S:LongInt):LongInt;
var d, Res:LongInt;
Begin
Res:=0; d:=1;
While S<>0 Do Begin
Res:=Res+(S Mod 5)*d;
d:=d*10;
S:=S div 5;
End;
Fr10To5:=Res;
End;

Procedure RecB(i,j,d:Integer; Way:LongInt);
Var k,r:Integer;
Begin
If Way=0 Then
For k:=i To i+d-1 Do
For r:=j To j+d-1 Do A[k,r]:=true
Else Begin
k:=Way Mod 5-1;
r:=d div 2;
RecB(i+r*(k Div 2),j+r*(k Mod 2),r,Way Div 10);
End;
End;





Begin
Assign(Input,'Input.txt'); Reset(Input);
Assign(Output,'Output.txt'); Rewrite(Output);
Readln(N);
NumTest:=0;
WHILE N<>0 do begin
Inc(NumTest);
Writeln('Image',NumTest);
IF N>0 then SolveA else SolveB;
END;
Close(Input);
Close(Output);
End.




Прошу помочь собрать программку, то есть связать все процедуры, пожалуйста.))
Надеюсь на помощь. Заранее спасибо.
Слай
up
Malice
Цитата(Слай @ 18.11.2007 13:53) *

up

Явно не полное условие, нигде не описан прицип, откуда берутся эти 9, 14, 17 и т.д. Или с этим разобрался уже ? Если да, то не понятно что требуется..
зы на олимпиадную смахивает, не хватает тока ограничивающих условий по памяти и времени выполнения smile.gif
Слай
ТУТ можно посмотреть информацию по задаче.

А принцип получения этих чисел мне понятен))
Слай
up
Malice
Ну а что, уп.. Если, как ты говоришь, ты понял принцып, то все просто. Для начала попробуй это скомпилировать, добавь описания недостающих переменных (например глобально cnt, cp..). Как скомпилится пробуй исправлять логические ошибки. Например в процедуре
Procedure PrintA;
Var i,j: integer;
Var N,M: integer;
BEGIN
for i:=1 to N do
for j:=1 to M do
begin
Write(A[i,j])
end;
END;

явно видно, что после описания переменных N и M они используются не инициализируемыми, а должны быть равны размеру матрицы (первому числу в исходном файле). Ну и в таком духе, стобы не осталось строк типа:
      c:=A[i,j]; {, когда с - boolean, а a[i,j]-integer;}

и таких тоже:
      Cp[Cnt]:=<Bygaga>
smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.