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

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

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

> Рекурсия, не могу найти ошибку, N нас. пунктов, пары пунктов соединены, узнать, можно ли попасть из
сообщение
Сообщение #1





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

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


Текст задачи:
Имеется N населенных пунктов, пронумерованных от 1 до N (N = 10).
Некоторые пары пунктов соединены дорогами. Определить, можно ли по
дорогам попасть из пункта 1 в N-й пункт. Информация о дорогах задается в
виде последовательности пар чисел i и j (i < j), указывающих что i-й и j-й
пункты соединены дорогой. Признак конца этой последовательности – пара
нулей.
Из условия я вынес 1 из основных положений, что по кругу между пунктами мы ходить не будем, т.е. например
1-2-3-5-6-1 (- догора), задача после этого сущаственно упростилась:) написал, но не работает прога, помогите плиз найти ошибку.. или мот я в корне был не прав.. наставьте на путь правильный

Мой код:


Program lab;
Type int=integer;
mas=array [1..30, 1..2]of int;
{ 30 - условное число, просто чтобы ограничить массив}
Var fl: boolean;
x: mas;
k:int;

Procedure vvod(a:mas);
Var x,y,i:int;
begin
Writeln('vvedite parbl 4isel');
x:=1;y:=1;i:=0;
While (x<>0) and (y<>0) do
begin
if i<>0 then begin
a[i,1]:=x;
a[i,2]:=y;
end;
Write('vvedite 1 4islo ');readln(x);
Write('vvedite 2 4islo ');readln(y);
i:=1+i
end
end;

procedure find(A:int;var f:boolean);
Var i:int;
begin
if x[A,2]=10 then f:=true
else begin
i:=1;
while (x[i,1]<>0) and (x[i,2]<>0) and (not f) do
begin
if x[A,2]=x[i,1] then
find(i,f);
i:=i+1
end
end
end;

Begin
vvod(x);
fl:=false;
k:=1;
while (x[k,1]<>0) and (x[k,2]<>0) and (not fl) do
begin
if x[k,1]=1
then find(k,fl);
k:=k+1
end;

if fl
then writeln('yes')
else writeln('nno')
End.


первый проход вынес в основную программу, т.к. нужно было сделать 1 проход по всем x(i,1)=1, т.е. тем. у которых первый пункт - наш начальный и в процедуре в стоке "if x[A,2]=x[i,1] then .." не смог бы подставить вместо x[i,1] единицу
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


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

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

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


Цитата(Cool_abc @ 25.04.2010 2:46) *
наставьте на путь правильный
...
первый проход вынес в основную программу, т.к. нужно было сделать 1 проход по всем x(i,1)=1, т.е. тем. у которых первый пункт - наш начальный и в процедуре в стоке "if x[A,2]=x[i,1] then .." не смог бы подставить вместо x[i,1] единицу

Cool_abc, подобные вещи в рекурсии - первый признак, что что-то не так. Рекурсия должна быть элегантной )). Извини, не стал глубоко вникать в твой код. Я написал решение - проанализируй и попробуй сам найти свои ошибки.
const
n=10; // no more then 255

type
tVisited= set of byte; // to remember already visited towns

var
r: array[1..n,1..n]of boolean; // roads
f: text; // input data, one pair each line


function c(a,b: byte; v: tVisited): boolean; // connected?
var
s: boolean; // scan result
i: integer;
begin
Include(v,a); // "here was i! ))"
if r[a,b] then c:=true else begin
s:=false;
for i:=1 to n do s:=s or not(i in v) and r[a,i] and c(i,b,v);
c:=s
end;
Exclude(v,a) // leaving the town
end;

var
a,b: integer;

begin
FillChar(r,SizeOf®,0); // roads init
Assign(f,'roads.dat');
ReSet(f);
while not EoF(f) do begin
ReadLn(f,a,b);
if a=0 then break; // added for compatiblity
r[a,b]:=true; // add a road
r[b,a]:=true // add a road back
end;
Close(f);
WriteLn(c(1,n,[]))

;ReadLn
end.

Если комментов недостаточно - спрашивай, я всегда отвечу. Удачи! smile.gif

Добавлено через 4 мин.
Да, еще: входные данные ьерутся из файла roads.dat . Вот его пример:
Код
1 5
10 8
2 10
3 8
5 3

- тут ответ ДА. Нули в конце можешь добавить, но они не нужны (правда, в этом случае не должно быть пустых строк в конце).


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





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

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


Цитата(Lapp @ 25.04.2010 3:31) *

Добавлено через 4 мин.
Да, еще: входные данные ьерутся из файла roads.dat . Вот его пример:
Код

1 5
10 8
2 10
3 8
5 3

- тут ответ ДА. Нули в конце можешь добавить, но они не нужны (правда, в этом случае не должно быть пустых строк в конце).

эм... здесь же по условию не подходят дходные данные.. x(i,j), где i < j, т.е. 10-8 и 5-3 не может быть. Первое число ( x[i,1] ) - это город, в который мы приходим, а 2 число ( x[i,2] ) - это город, в который ведет дорога из города x[i,1], я так понимаю. Поиск мы останавливаем, когда наткнулись на элемент x[i,2]=10, т.е. дорога из текущего города ведет в город под номером 10, а до этого элемента уже есть дорога (т.е. мы до него шли от одного из x[i,1] = 1 (по 1 из дорого, ведущих из 1 города))
но если бы даже не было условия i<j, то мы все равно бы не попали..
смотрим, где x[i,1]=1, нашли все такие элементы, их число = 1, значит смотрим дальше x[i,2] = 5, значит ищем все x[i,1]=5, их опять 1, это 5 3, дальше ищем x[i,1]=3, нашли, это 3 8, ищем x[i,1]=8, таких нет, дорога оборвалась и разветвлений никаких не было (т.е. до этого из каждого города выходило по 1 дороге), значит ответ "нет".
насчет кода с решением, спасибо, сёчас буду читать, разбираться в нём

Цитата(volvo @ 25.04.2010 9:09) *

Cool_abc, поиск ошибок начинай прямо с процедуры Vvod. Ну, заполнил ты в ней массив какими-то значениями, и что? Посмотри, что у тебя хранится в массиве X после того, как Vvod отработал. Это первое.

Второе - я говорил много раз, и повторю еще раз: не пользуйся никогда магическими числами. Вот это что по-твоему:
procedure find(A:int;var f:boolean);
Var i:int;
begin
if x[A,2]=10 then f:=true { <--- Почему именно 10? }

Я вот ввел 5 пар значений, и сразу даже не сообразил, в чем дело. У тебя ж считается количество введенных пар, следовательно ты знаешь, сколько городов есть и с каким числом надо сравнивать...

В общем, если хочешь продолжить разбираться со своим методом решения - скажи...

да, сейчас буду продолжать разбираться, за процедуру vvod спасибо:) понял, где там ошибка, у нас в локальных переменных x,y будут оставаться храниться нули, но мы их в массив не занесли;
вот насчет магических числем.. я читал вашу тему "Как не надо писать программы", но тут без 10 никак), потому что по условию задачи, нам нужно найти дорогу из города 1 в город 10, т.е. в предпоследнем городе перед 10 городом из него будет идти дорога в город 10, что описано условием x[A,2]=10, поэтому имеено 10..
число городов у нас есть, оно ограничено, самый большой номер города м.б. равен 10; неограничено только число дорог, которые могуд идти из одного города, т.е. из первого города могут идти дороги во 2, 3,4,5,6,7 города, что будет выглядеть как
1-2
1-3
1-4
1-5
1-6
1-7
в массиве

дошел дальше разбираться smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Cool_abc   Рекурсия, не могу найти ошибку   25.04.2010 5:46
Lapp   наставьте на путь правильный ... первый проход вын…   25.04.2010 7:31
Cool_abc   [b]Добавлено через 4 мин. Да, еще: входные данн…   25.04.2010 17:46
Cool_abc   Рекурсия [b]должна быть элегантной )). funct…   25.04.2010 23:12
volvo   Cool_abc, поиск ошибок начинай прямо с процедуры V…   25.04.2010 13:09
Lapp   эм... здесь же по условию не подходят дходные данн…   26.04.2010 10:17
Cool_abc   Упс!.. мой фолт, извиняюсь, недосмотрел. Ус…   26.04.2010 18:34
Lapp   из условия i<j я понимал, что из этого следует…   27.04.2010 11:13
TarasBer   > раньше у меня схожее с этим заменялось введен…   26.04.2010 20:04
Cool_abc   ... Хотя да, разницы тут, если всмотреться, нет, …   26.04.2010 20:23
TarasBer   Это программа, которую я специально написал только…   26.04.2010 20:31
volvo   Я тебе открою тайну: если перед этим самым циклом …   27.04.2010 16:01
Lapp   Повторяю еще раз: у этого форума задача - научить …   27.04.2010 16:43
TarasBer   > Количество инструкций еще не прямо пропорцион…   27.04.2010 16:12
volvo   В таком случае извините, что столько времени вам н…   27.04.2010 16:46


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

 





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