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

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

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

> Рекурсия, не могу найти ошибку, N нас. пунктов, пары пунктов соединены, узнать, можно ли попасть из
Cool_abc
сообщение 25.04.2010 1:46
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 25.04.2010 3:31
Сообщение #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 
 К началу страницы 
+ Ответить 
Cool_abc
сообщение 25.04.2010 13:46
Сообщение #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 1:46
Lapp   наставьте на путь правильный ... первый проход вын...   25.04.2010 3:31
Cool_abc   [b]Добавлено через 4 мин. Да, еще: входные данн...   25.04.2010 13:46
Cool_abc   Рекурсия [b]должна быть элегантной )). funct...   25.04.2010 19:12
volvo   Cool_abc, поиск ошибок начинай прямо с процедуры V...   25.04.2010 9:09
Lapp   эм... здесь же по условию не подходят дходные данн...   26.04.2010 6:17
Cool_abc   Упс!.. мой фолт, извиняюсь, недосмотрел. Ус...   26.04.2010 14:34
Lapp   из условия i<j я понимал, что из этого следует...   27.04.2010 7:13
TarasBer   > раньше у меня схожее с этим заменялось введен...   26.04.2010 16:04
Cool_abc   ... Хотя да, разницы тут, если всмотреться, нет, ...   26.04.2010 16:23
TarasBer   Это программа, которую я специально написал только...   26.04.2010 16:31
volvo   Я тебе открою тайну: если перед этим самым циклом ...   27.04.2010 12:01
Lapp   Повторяю еще раз: у этого форума задача - научить ...   27.04.2010 12:43
TarasBer   > Количество инструкций еще не прямо пропорцион...   27.04.2010 12:12
volvo   В таком случае извините, что столько времени вам н...   27.04.2010 12:46


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

 



- Текстовая версия 20.07.2025 18:37
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"