Program Bombastic; Const MaxN = 1000; Type TCell = Record i, j: Word; k: LongInt; End; Var f: Text; res: Array [1..MaxN, 1..MaxN] of LongInt; // массив результатов N, M, i, j, k: LongInt; c: Char; queue: Array [1..MaxN*MaxN] of TCell; // очередь на обработку в поиске в ширину r, w, S: LongInt; Begin Assign(f, 'bombast.in'); Reset(f); Readln(f, N, M); r:= 0; w:= 1; k:= 0; For i:= 1 To N Do Begin For j:= 1 To M Do Begin Read(f, c); Case c of 'o': Begin res[i,j]:= 0; //клетка пока не охвачена никем - в процессе //поиска массив res постепенно заполняется End; 'x': Begin Inc(k); queue[w].k:= k; queue[w].i:= i; queue[w].j:= j; Inc(w); res[i,j]:= k; End; End; End; Readln(f); End; Close(f); {Просто BFS, или даже, в данном случае, волной алгоритм: если до какой-то клетки волна от двух различных клеток доходит одновременно, то раньше в очереди стоит клетка с меньшим номером, соответственно, она первой и отметит новую клетку. Поиск заканчиваем, когда до всех клеток дойдёт волна. } S:= N*M; While w<=S Do Begin Inc(r); i:= queue[r].i; j:= queue[r].j; If i>1 Then Begin If res[i-1,j]=0 Then Begin res[i-1,j]:= queue[r].k; queue[w].i:= i-1; queue[w].j:= j; queue[w].k:= queue[r].k; Inc(w); End; End; If i1 Then Begin If res[i,j-1]=0 Then Begin res[i,j-1]:= queue[r].k; queue[w].i:= i; queue[w].j:= j-1; queue[w].k:= queue[r].k; Inc(w); End; End; If j