Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2008, 19:04   #1
Chosen One
Новичок
Джуниор
 
Регистрация: 26.12.2008
Сообщений: 2
По умолчанию Комнаты музея - задача

Вот постановка задачи


помогите исправить листинг:
Код:
Идея решения: 
Данную задачу можно решить используя метод перебора с возвратом. 
Используя массив координат перемещения, смотрим, где отсутствуют стены, для каждой клетки, и последовательно двигаемся в ту клетку, в которую 
возможно, предварительно помечая клетку, в которой уже были. Если мы зашли в тупик, то возвращаемся в клетку, из которой вышли. Одновременно считаем количество клеток в каждой комнате. Когда происходит возврат в начальную точку движения, делаем всю комнату просмотренной (при помощи массива логического типа). Затем ищем клетку, в которой ещё не были и делаем её начальной точкой движения. 

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(B),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.
Chosen One вне форума Ответить с цитированием
Старый 26.12.2008, 19:21   #2
Chosen One
Новичок
Джуниор
 
Регистрация: 26.12.2008
Сообщений: 2
По умолчанию

и желатьльно в течении пары часов надо, так как через 12 часов надо защищаться
Chosen One вне форума Ответить с цитированием
Старый 26.12.2008, 19:33   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Chosen One В суть программы и задание не вникал. Смотрел только ошибки:
Код:
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; соответствует степени двойки}
заменить на
Код:
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; {соответствует степени двойки}
Код:
B[i,j]:=False; {делаем клетку, в которой последний раз были не просмотренной, чтобы рассмотреть другие варианты хода из неё в другую клетку}
на
Код:
B[i,j]:=False; {делаем клетку, в которой последний раз были не просмотренной, }
{чтобы рассмотреть другие варианты хода из неё в другую клетку}
Вот здесь:
Код:
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 {определяем, заходили ли мы в клетку ранее}
Надо подправить выделенную строчку. Видимо, стерли случайно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача Nil_rus Помощь студентам 3 15.05.2008 09:05