IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Лабиринт, pдача на рекурсию или ..?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Лабиринт размером M x N состоит из комнат размером 1 x 1 и стен размером 1 x 1. Дан план лабиринта, на котором цифрой 1 отмечены стены, а цифрой 0 - комнаты.

Выяснить, сможет ли человек выйти из лабиринта, если его поместить в комнату с координатами (A, B)?

Порядок ввода исходных данных:

M
N
p11 p12 ... p1N
p21 p22 ... p2N
. . .
pM1 pM2 ... pMN
A B
Здесь M - количество строк на рисунке плана, N - количество столбцов на рисунке плана, p(i, j) - цифра ноль или один, соответствующая клетке плана с координатами i, j. A, B - координаты человека в лабиринте.

Порядок вывода результатов:

Да | Нет
Пример ввода:

10
10
1 1 1 1 1 1 1 1 0 1
1 0 0 0 0 0 0 0 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 0 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
2 2
Пример вывода:

Да



Эту задачу надо решать рекурсией??

Сообщение отредактировано: xxx000 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Не надо, а можно... Можно - рекурсией, можно - без рекурсии. Как тебе удобнее.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 14.07.2010 21:15) *

Не надо, а можно... Можно - рекурсией, можно - без рекурсии. Как тебе удобнее.

А как без рекурсии, рекурсией она по времени не проходит.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
А как без рекурсии, рекурсией она по времени не проходит.


Про время сначала вообще ни слова не было.. Может, покажешь, как решал рекурсией? Задача интересная, но я вот тоже не понимаю, как итеративно решить можно. Может, дерево строить надо.

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Unconnected @ 16.07.2010 2:16) *
Про время сначала вообще ни слова не было..

Не только про время - ни слова про ограничения на величины M и N.. Догадывайтесь сами, дорогие друзья, и делайте выводы - рекурсей решать или нет.. Никакого уважения к собеседникам.
Вообще, этот товарищ со значащим именем xxx000 все равно не особо заботится о том, что ему скажут, и не любит отвечать..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> А как без рекурсии, рекурсией она по времени не проходит.

Рекурсия - самый быстрый способ обхода, вообще-то.
Просто не надо обходить клетки, в которых уже был.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 16.07.2010 10:49) *
Рекурсия - самый быстрый способ обхода, вообще-то.

Несколько странное утверждение. Рекурсия не есть алгоритм. Это всего лишь способ программирования. И рекурсию, как и явные итерации, можно проводить по-разному.. Хотя, я не стану утверждать, что этот способ не имеет обратного влияния на алгоритм. Но, безусловно, постоянные вызовы поцедур и дерганье стека, сильно замедляет программу (и ест память).

Впрочем, все эти разговоры все равно никому не нужны. Автор темы больше не покажется, проверено. До следующей "рдачи" (С), в которой он снова не даст достаточно данных.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Да, кажется, действительно ест. Сделал так:

{$APPTYPE CONSOLE}

const mm=10;nn=10;

var mp:array[1..mm,1..nn] of char;
m,n,a,b,i,j:byte;
s:string;

Procedure yes;
begin
writeln('Да');
halt;
end;

Procedure no;
begin
writeln('Нет');
halt;
end;

Procedure rec(a,b:byte);
begin
if a=m then yes else begin
if ((a<m) and (mp[a+1,b]='0')) then rec(a+1,b) else
if ((a>1) and (mp[a-1,b]='0')) then rec(a-1,b) else
if ((b<n) and (mp[a,b+1]='0')) then rec(a,b+1) else
if ((b>1) and (mp[a,b-1]='0')) then rec(a,b-1) else no;
end;
end;

begin
assign(input,'input.txt');
readln(m);
readln(n);
for i:=1 to m do begin
readln(s);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
for j:=1 to n do mp[i,j]:=s[j];
end;
read(a,b);
assign(output,'output.txt');
rec(a,b);
end.




, при размерах поля 10*10 вылетает с переполнением стека. А если урезать как минимум до 7*10, то не вылетает, и даже выдаёт правильный результат. Хотя, может это я чего намудрил)

ADDED: да, что-то совсем не то я сделал.. Мысля пришла опосля.

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


{$APPTYPE CONSOLE}

const mm=10;nn=10;

var mp:array[1..mm,1..nn] of char;
m,n,a,b,i,j:byte;
s:string;

Procedure yes;
begin
writeln('Да');
halt;
end;

Procedure no;
begin
writeln('Нет');
halt;
end;

Procedure rec(a,b:byte);
begin
if (a=1) or (a=m) or (b=1) or (b=n) then yes else begin
mp[a,b]:='*';
if mp[a+1,b]='0' then rec(a+1,b);
if mp[a-1,b]='0' then rec(a-1,b);
if mp[a,b+1]='0' then rec(a,b+1);
if mp[a,b-1]='0' then rec(a,b-1);
no;
end;
end;

begin
assign(input,'input.txt');
readln(m);
readln(n);
for i:=1 to m do begin
readln(s);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
for j:=1 to n do mp[i,j]:=s[j];
end;
read(a,b);
assign(output,'output.txt');
rec(a,b);
end.



Вот так вроде лучше, не вылетает и на больших полях (20*10 пробовал).


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
не вылетает и на больших полях
Правда и ответ неверный выдает, но это уже мелочи smile.gif

10
10
1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 1 1 1 1 1 1 0 1
1 0 0 0 1 1 1 1 0 1
1 1 1 0 1 1 1 1 0 1
1 1 1 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
2 2

Чего должно вывести? А выводит?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


"Нет" выводит.. Как и должно.

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Правда?

Прикрепленное изображение

Что я сделал не так?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Мм.. я на D2007 компилирую, может, в этом дело? Сейчас ещё раз скопировал с форума код и входные данные - всё равно нет. Качаю FPC, на нём попробую.

//Собсно, тут тоже алгоритм неправильный.

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


{$APPTYPE CONSOLE}

const mm=10;nn=10;

var mp:array[1..mm,1..nn] of char;
m,n,a,b,i,j:byte;
s:string;

Procedure yes;
begin
writeln('Да');
halt;
end;

Procedure no;
begin
writeln('Нет');
halt;
end;

Procedure rec(a,b:byte);
begin
if (a=1) or (a=m) or (b=1) or (b=n) then yes else begin
if mp[a+1,b]='0' then begin
mp[a,b]:='*';
rec(a+1,b);
mp[a,b]:='0';
end;
if mp[a-1,b]='0' then begin
mp[a,b]:='*';
rec(a-1,b);
mp[a,b]:='0';
end;
if mp[a,b+1]='0' then begin
mp[a,b]:='*';
rec(a,b+1);
mp[a,b]:='0';
end;
if mp[a,b-1]='0' then begin
mp[a,b]:='*';
rec(a,b-1);
mp[a,b]:='0';
end;
no;
end;
end;

begin
assign(input,'input.txt');
readln(m);
readln(n);
for i:=1 to m do begin
readln(s);
while pos(' ',s)>0 do delete(s,pos(' ',s),1);
for j:=1 to n do mp[i,j]:=s[j];
end;
read(a,b);
assign(output,'output.txt');
rec(a,b);
end.



Тут правильный.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 618
Пол: Мужской

Репутация: -  24  +


Цитата(volvo @ 18.07.2010 2:02) *
Что я сделал не так?
Ошибка локализации =)
Прикрепленное изображение


--------------------
Close the World...txeN eht nepO
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 11.01.2025 6:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name