Program Tiles2; Const MaxSize=500; Type TCell = Record i, j: LongInt; End; TQueue = Array [1.. Sqr(MaxSize+1)] of TCell; Var field: Array [0..MaxSize+1, 0..MaxSize+1] of Char; q0, q1, tmp: ^TQueue; r0, w0, w1: LongInt; N: LongInt; f: Text; i, j, ij: LongInt; delta: Array [0..3] of TCell; k, res: LongInt; c: TCell; Begin {Ввод данных} Assign(f, 'tiles2.in'); Reset(f); Readln(f, N); For i:= 1 To N Do Begin For j:= 1 To N Do Begin Read(f, field[i,j]); End; Readln(f); End; Close(f); { Создаём "бордюр" из разрушенных клеток - они ничему не мешают, а реализация} { упрощается - можно считать, что всегда начинаем с разрушенной клетки } For i:= 0 To N+1 Do Begin field[i, 0]:= 'x'; field[i, N+1]:= 'x'; End; For j:= 1 To N Do Begin field[0, j]:= 'x'; field[N+1, j]:= 'x'; End; {delta - массив вариантов хода до соседней } {клетки - нужен для упрощения реализации } delta[0].i:= 0; delta[0].j:=-1; delta[1].i:= 0; delta[1].j:= 1; delta[2].i:=-1; delta[2].j:= 0; delta[3].i:= 1; delta[3].j:= 0; New(q0); // "старая" очередь при поиске в ширину; w0 - её длина New(q1); // "новая" очередь при поиске в ширину; w1 - её длина // старая очередь - клетки, достигаемые за время Т // новая очередь - клетки, достигаемые за время Т+1 // при построении новой очереди через разрущенные клетки проходим насквозь // (продолжаем поиск из них), а в клетках с плиткой останавливаемся, // поиск из них не продолжаем; достигается этот тем, что клетку с плиткой // не включаем в старую очередь, а включаем в новую очередь - поиск из них // начнётся только на следующем такте времени q1^[1].i:= 0; q1^[1].j:= 0; w1:= 2; k:= -1; Repeat Inc(k); r0:= 1; w0:= w1; w1:= 1; tmp:= q0; q0:= q1; q1:= tmp; res:= w0-1; While r0=0) and (c.j>=0) and (c.i<=N+1) and (c.j<=N+1) Then Begin If field[c.i, c.j] in ['x','o'] Then Begin If field[c.i,c.j]='x' Then Begin q0^[w0]:= c; Inc(w0); End Else {field[c.i,c.j]='o'} Begin q1^[w1]:= c; Inc(w1); End; field[c.i, c.j]:= '.'; End; End; End; Inc(r0); End; Until w1=1; Dispose(q0); Dispose(q1); Assign(f, 'tiles2.out'); Rewrite(f); Writeln(f, k, ' ', res); Close(f); End.