Пройти лабиринт по правилу правой руки. |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Пройти лабиринт по правилу правой руки. |
DarkWishmaster |
27.03.2011 18:43
Сообщение
#1
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Есть лабиринт, надо его пройти по правилу правой руки.
вот к примеру 7 9 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 2 1 1 1 1 1 3 1 1- блок 0 - пусто 2- вход 3- выход Я знаю как должен вести себя робот, но проблема в том что не могу написать его поведение на Паскале, может вы поможете? Тут надо помнить в какую сторону смотри робот что-бы можно было знать относительно него какая сторона есть - право а какая -лево для этого я исп. процедуры: например если робот смотрит вверх то он идет по x=-1, y=0
Но тут проблема в том что например робот идёт направо, там тупик и направо тоже тупик он поворачивает налево и он должен придерживаться уже левой стены, это самое главное реализовать. Ну потом что-бы показать результат для самого короткого пути то все клетки увелечиваем на еденицу если робот по ней прошел, и дальше проходим по меньшим единицам пока доходим до цели. Сообщение отредактировано: DarkWishmaster - 27.03.2011 19:13 |
Freedom |
27.03.2011 18:57
Сообщение
#2
|
Пионер Группа: Пользователи Сообщений: 113 Пол: Мужской Реальное имя: Надир Репутация: 6 |
Но тут проблема в том что например робот идёт направо, там тупик, он поворачивает налево и он должен придерживаться уже левой стены, это самое главное реализовать. а что если тупик, то повернуться не один раз налево а два раза? -------------------- From ZERO to HERO
|
DarkWishmaster |
27.03.2011 19:12
Сообщение
#3
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
|
DarkWishmaster |
28.03.2011 21:07
Сообщение
#4
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Вообщем вот что получилось:
Для примера массива что я написал выше, он идёт наверх, поворачивает, видет что там тупик, и идёт в обратном направлении пока дойдёт до входа, и опять всё заново (( З.Ы , как тут спойлер написать? что-бы можно было свернуть весь код. Там откуда я взял задачу, она по техники Greedy, и есть Подсказка: Выбирать из Множество [Вниз, Вверх, Направо, Налево] так что-бы робот двигался вдоль одной стены. Сообщение отредактировано: DarkWishmaster - 28.03.2011 21:12 |
TarasBer |
29.03.2011 9:20
Сообщение
#5
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ну и жесть вы понаписали.
Я так и не понял, а где вы храните, в какую сторону смотрит робот?
> if Block(i+x,j+y)=True then Да чего уж там, давай сразу if true=(true=((Block((i+x+0)*1, (j+y+1-1)*1)=true)=true)) Не надо писать =true, ясно? Это тавтология потому что. Сообщение отредактировано: TarasBer - 29.03.2011 9:23 -------------------- |
DarkWishmaster |
29.03.2011 13:38
Сообщение
#6
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Ну и жесть вы понаписали. Я так и не понял, а где вы храните, в какую сторону смотрит робот?
> if Block(i+x,j+y)=True then Да чего уж там, давай сразу if true=(true=((Block((i+x+0)*1, (j+y+1-1)*1)=true)=true)) Не надо писать =true, ясно? Это тавтология потому что. У меня там переменые x и y меняются в зависимости от того куда смотрит робот например если x=-1 y=0 тогда когда мы вызываем процедуру Move(i,j); то он идёт наверх на 1 единицу (i-1, j+0) т.е он смотри на север. З.Ы если мы делаем так: IF Ok then то оператор сразу понимает что Ok(boolean) должен быть True? а для False как? If not ok then ? Сообщение отредактировано: DarkWishmaster - 29.03.2011 13:41 |
TarasBer |
29.03.2011 13:46
Сообщение
#7
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> У меня там переменые x и y меняются в зависимости от того куда смотрит робот
Я понял. У тебя x, y - это вектор сдвига, а i, j - координаты. Плохие названия, неговорящие. Обычно x, y - координаты, а dx, dy - вектор сдвига. Но в данном случае как раз проще хранить в качестве направления именно число от 0 до 3. > З.Ы если мы делаем так: IF Ok then то оператор сразу понимает что Ok(boolean) должен быть True? а для False как? If not ok then ? Ну да. Это должно быть очевидно, если понимать, что заголовок оператора if - это любое выражение типа boolean. Это может быть как переменная этого типа ( if b then ... ), так и оператор, возвращающий значение этого типа ( if x>y then ... ). Добавлено через 1 мин. > if (a[i,j]=1) or (i>n) or (j>m) then Block:=True else Block:=False; Тоже типичный бульщит (bool shit) А сразу почему не написать Block := (a[i,j]=1) or (i>n) or (j>m); -------------------- |
DarkWishmaster |
29.03.2011 13:54
Сообщение
#8
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Tarasber, спасибо, исправлюсь, пока в привычку не вошло.
|
DarkWishmaster |
30.03.2011 18:17
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Вот что получилось, робот находит выход, только он идёт по очень длиному пути. Пробовал использовать матрицу B для генерации ответа ( надо пройти по минимальным числам ), но это не получилось... Сообщение отредактировано: DarkWishmaster - 30.03.2011 18:22 |
-TarasBer- |
30.03.2011 18:42
Сообщение
#10
|
Гость |
Так если ты хочешь кратчайший путь, то это тебе не правая рука нужна, а "обход в ширину" (в википедии поищи).
|
-TarasBer- |
30.03.2011 18:44
Сообщение
#11
|
Гость |
> i:=i+dx[robot.direction];
j:=j+dy[robot.direction]; Вот нахрена я заводил поля robot.x и robot.y , если ты всё равно координаты хранишь в i, j? |
DarkWishmaster |
30.03.2011 18:53
Сообщение
#12
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
|
-TarasBer- |
30.03.2011 18:56
Сообщение
#13
|
Гость |
Через год ты проклянёшь себя при попытке понять, почему i,j - это координаты робота и для чего заведены поля x и y.
|
Lapp |
1.04.2011 8:06
Сообщение
#14
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Нн-дя...
DarkWishmaster, ты извини, но ТАК программировать НЕЛЬЗЯ.. Я впервые вижу такое.. Возвращаемый результат процедуры - параметры цикла!! Где ты это почерпнул?? Я имею в виду сейчас, как ты находишь вход (процедура Enter). Давай разберем. По возрастанию важности ошибок: 1. Зачем делать процедурой кусок кода, который будет использован один раз? 2. Зачем проходить по масиву повторно? Ты мог сделать это при вводе. 3. Нельзя использовать значения параметров цикла вне цикла. Их значения не гарантируются. 4. Параметры цикла должны быть ЛОКАЛЬНЫМИ, то есть описаны внутри процедуры. Только ТР может пропустить такое, всякий нормальный современный компилятор выдаст ошибку. 5. При выполнении п.4 значения i и j будут недоступны в вызывающем модуле. Я даже и не знаю, что тут еще добавить и какие рекомедации дать. Постарайся сделать выводы сам. Так, пойду смотреть дальше.. Слушай, DarkWishmaster, ну я же просил тебя уже, кажется: пожалуйста, форматируй код! Ну это же не стихи, где ты можешь писать лесенкой, как тебе вздумается, под Маяковского. Процедура Print - энды пляшут танец с саблями что ли? Ладно, с меня пока хватит. Я совершенно не понимаю, как можно ТАК УСЛОЖНИТЬ простейшую задачу. Вот тебе код - надеюсь, ты его разберешь. Заметь, что собственно решение занимает в нем 8 строк (в конце). type Пример входного файла: 1111111 Размеры прямоугольника - любые. Пробелы (или нули) обязательны (даже в конце строк). В конце файла не должно быть пустых строк!! -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
1.04.2011 8:50
Сообщение
#15
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> 1. Зачем делать процедурой кусок кода, который будет использован один раз?
Ну это-то как раз правильно. -------------------- |
Lapp |
1.04.2011 10:17
Сообщение
#16
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
> 1. Зачем делать процедурой кусок кода, который будет использован один раз? Ситуации, когда это оправдано, безусловно, бывают, и нередко. Но всегда полезно спросить (себя) - зачем? Так вот, в данном случае я не нахожу ответа на этот вопрос . Достаточно было выделить этот кусок комментариями. Это не ошибка в прямом смысле слова. Тут это сыграло даже положительную роль. Как всегда, диалектика: не сделал бы он этого, никто бы сказал ему про остальные ошибки, и они бы остались надолго.. А сейчас, надеюсь, выводы будут сделаны .Ну это-то как раз правильно. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
DarkWishmaster |
1.04.2011 14:47
Сообщение
#17
|
Бывалый Группа: Пользователи Сообщений: 168 Пол: Мужской Репутация: 3 |
Спасибо, Lapp и TarasBer, буду исправляться по тихоньку.
|
Текстовая версия | 19.04.2024 2:07 |