Головна
Оргкомітет та журі
Реєстрація
Таблиця учасників
Тренувальний тур
Розв'язок тренувального туру
Перший тур
Розв'язок тренувального туру

Результат виконання відправляти кожному учаснику у листі, який би містив:

- код задачі;
- кількість отриманих балів;
- тести для перевірки;
- авторський розв’язок.


Задача: Прохід по лабиринту (100 балів)

Koд: VOI_01

const LN = 50; LM = 50;
var a:array[1..LN,1..LM] of byte;
p:array[1..LN*LM,1..2] of byte;
s:array[1..LN*LM,1..2] of byte;
n,m,si,sj,ei,ej,index,min:integer;

procedure INIT;
var i,j:integer;
begin
assign(input,''lab.in''); reset(input);
assign(output,''lab.out''); rewrite(output);
readln(n,m);
readln(si,sj);
readln(ei,ej);
for i:=1 to n do begin
for j:=1 to n-1 do begin
read(a[i,j]);
end;
readln(a[i,n]);
end;
index:=0; min:=ln*lm;
end;

procedure Store;
begin
if (min > index) then begin
move( p, s, sizeof(p) );
min:=index;
end;
end;

procedure DONE;
var i:integer;
begin
for i:=1 to min do writeln(s[i,1],'':'',s[i,2]);
end;

procedure FindPath(i,j:integer);
begin
a[i,j]:=2;
inc(index);
p[index,1]:=i; p[index,2]:=j;
if (i=ei) and (j=ej) then begin
Store;
end else begin
if (i>1) and (a[i-1,j]=0) then FindPath(i-1,j);
if (i<n) and (a[i+1,j]=0) then FindPath(i+1,j);
if (j>1) and (a[i,j-1]=0) then FindPath(i,j-1);
if (j<m) and (a[i,j+1]=0) then FindPath(i,j+1);
end;
dec(index);
a[i,j]:=0;
end;

begin
INIT;
FindPath(si,sj);
DONE;
end.


Задача: Працівники (100 балів)
Koд: VOI_02

Задача про відшукання кількості розташування дужок у арифметичному виразі є досить поширеною. Послідовність чисел, які утворюються при розв’язанні цієї задачі при n=1,2,… називають послідовністю Каталана.
Можна помітити, що кількість різних вхідних даних дорівнює 13, тобто усі ці випадки можна перелічити у програмі, заздалегідь обрахував відповіді на них. Звісно, за час туру неможливо вручну перелічити усі випадки, і доведеться робити це з допомогою комп’ютера.
Опис тестів до задачі “Працівники”
N Відповідь
2 1
6 5
8 14
10 42
12 132
18 4862
22 58786
24 208012
26 742900
28 2674440




program Staff;

const
FILE_IN = ''STAFF.DAT'';
FILE_OUT = ''STAFF.SOL'';
MAX_DETAILS = 28;
PEOPLE : array[1..MAX_DETAILS] of LongInt =
(0, 1,
0, 2,
0, 5,
0, 14,
0, 42,
0, 132,
0, 429,
0, 1430,
0, 4862,
0, 16796,
0, 58786,
0, 208012,
0, 742900,
0, 2674440);

var
Fin : Text;
Fout : Text;
DetailsNum : Integer;

begin
Assign(Fin, FILE_IN);
Reset(Fin);
ReadLn(Fin, DetailsNum);
Close(Fin);

Assign(Fout, FILE_OUT);
Rewrite(Fout);
WriteLn(Fout, PEOPLE[DetailsNum]);
Close(Fout);
end.