Идея решения: Данную задачу можно решить используя метод перебора с возвратом. Используя массив координат перемещения, смотрим, где отсутствуют стены, для каждой клетки, и последовательно двигаемся в ту клетку, в которую возможно, предварительно помечая клетку, в которой уже были. Если мы зашли в тупик, то возвращаемся в клетку, из которой вышли. Одновременно считаем количество клеток в каждой комнате. Когда происходит возврат в начальную точку движения, делаем всю комнату просмотренной (при помощи массива логического типа). Затем ищем клетку, в которой ещё не были и делаем её начальной точкой движения. Uses crt; Const n=100; X:array[0..3]of -1..1=(0,-1,0,1); {массив координат перемещения по Y:array[0..3]of -1..1=(-1,0,1,0); клеткам. Индекс элемента массива Type Mas=array[0..n,0..n]of Integer; соответствует степени двойки} var A:mas; B:array[0..n,0..n]of Boolean; m,p,col,rooms,indexX,indexY:integer; procedure Init(Z:string); {заполнение из входного файла массива, представляющего цифровую карту музея} Var f:text; i,j:integer; Begin Assign(f,z); Reset(f); ReadLn(f,m,p); For i:=1 to m do begin For j:=1 to p do Read(f,A[i,j]); ReadLn(f); end; FillChar(B,SizeOf(,true); For i:=1 to m do For j:=1 to p do B[i,j]:=false; Close(f); end; function Degree2(i:integer):integer; {функция, вычисляющая i–ую степень двойки} var j,t:integer; begin t:=1; For j:=1 to i do t:=t*2; Degree2:=t; end; Procedure Solve(i,j:integer); Var k:integer; begin k:=3; While k>=0 do begin If A[i,j] направлении} begin If not B[i+X[k],j+Y[k]] then {определяем, заходили ли мы в клетку ранее} begin Inc(col); {учитываем клетку в общей площади комнаты} B[i,j]:=true; {отмечаем, что в текущей клетке мы уже были} Solve(i+X[k],j+Y[k]); {переходим в следующую клетку} B[i,j]:=False; {делаем клетку, в которой последний раз были не просмотренной, чтобы рассмотреть другие варианты хода из неё в другую клетку} end; end Else A[i,j]:=A[i,j]-Degree2(k); Dec(k); end; end; procedure Prosmotr; {данная процедура отмечает уже просмотренную комнату} var i,j:integer; begin For i:=1 to m do For j:=1 to p do If A[i,j]=0 then B[i,j]:=True; end; begin clrscr; Init('A:museum.txt'); rooms:=0; For indexX:=1 to m do {ищем ранее не просмотренную клетку} For indexY:=1 to p do If not B[indexX,indexY] Then begin col:=1; Inc(rooms); Solve(indexX,indexY); Write(Col,' '); {вывод площади только что просмотренной комнаты} Prosmotr; end; WriteLn; WriteLn(rooms); {вывод количества комнат} readkey; end. держи...