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

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

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

procedure RotD; //поворачивает направо
begin
if (x=0) and (y=1) then begin x:=1; y:=0; exit; end;
if (x=0) and (y=-1) then begin x:=-1; y:=0; exit; end;
if (x=-1) and (y=0) then begin x:=0; y:=1; exit; end;
if (x=1) and (y=0) then begin x:=0; y:=-1; exit; end;
end;
procedure RotS; // поворачивает налево
begin
if (x=0) and (y=1) then begin x:=-1; y:=0; exit; end;
if (x=0) and (y=-1) then begin x:=1; y:=0; exit; end;
if (x=-1) and (y=0) then begin x:=0; y:=-1; exit; end;
if (x=1) and (y=0) then begin x:=0; y:=1; exit; end;
end;


procedure Move;
begin
i:=i+x;
j:=j+y;
end;



Но тут проблема в том что например робот идёт направо, там тупик и направо тоже тупик он поворачивает налево и он должен придерживаться уже левой стены, это самое главное реализовать.

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

Сообщение отредактировано: DarkWishmaster - 27.03.2011 19:13
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
TarasBer
сообщение 29.03.2011 9:20
Сообщение #2


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

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

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


Ну и жесть вы понаписали.
Я так и не понял, а где вы храните, в какую сторону смотрит робот?


const
dx : array [0 .. 3] of integer = (1, 0, -1, 0);
dy : array [0 .. 3] of integer = (0, 1, 0, -1);

var
robot: record
x, y, direction: integer;// текущее направление тоже надо помнить
end;

begin
...
for d := robot.direction - 1 to robot.direction + 2 do begin // перебор по направлениям, начиная с того, что направо от текущего
robot.direction := (d + 4) mod 4; // просто переводим счётчик цикла к интервалу 0..3
if free[x+dx[robot.direction], y+dy[robot.direction]] then break; // если туда можно пойти, значит мы нашли нужное направление, выходим из цикла
end;
end.



> 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


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

Сообщений в этой теме
DarkWishmaster   Пройти лабиринт по правилу правой руки.   27.03.2011 18:43
Freedom   Но тут проблема в том что например робот идёт на...   27.03.2011 18:57
DarkWishmaster   а что если тупик, то повернуться не один раз нале...   27.03.2011 19:12
DarkWishmaster   Вообщем вот что получилось: Program Robot; Uses...   28.03.2011 21:07
TarasBer   Ну и жесть вы понаписали. Я так и не понял, а где ...   29.03.2011 9:20
DarkWishmaster   Ну и жесть вы понаписали. Я так и не понял, а где...   29.03.2011 13:38
TarasBer   > У меня там переменые x и y меняются в зависим...   29.03.2011 13:46
DarkWishmaster   Tarasber, спасибо, исправлюсь, пока в привычку не ...   29.03.2011 13:54
DarkWishmaster   Program Robot_Greedy; Uses Crt; const dx : arra...   30.03.2011 18:17
-TarasBer-   Так если ты хочешь кратчайший путь, то это тебе не...   30.03.2011 18:42
-TarasBer-   > i:=i+dx[robot.direction]; j:=j+dy[r...   30.03.2011 18:44
DarkWishmaster   > i:=i+dx[robot.direction]; j:=j+dy[...   30.03.2011 18:53
-TarasBer-   Через год ты проклянёшь себя при попытке понять, п...   30.03.2011 18:56
Lapp   Нн-дя... DarkWishmaster, ты извини, но ТАК програм...   1.04.2011 8:06
TarasBer   > 1. Зачем делать процедурой кусок кода, которы...   1.04.2011 8:50
Lapp   > 1. Зачем делать процедурой кусок кода, которы...   1.04.2011 10:17
DarkWishmaster   Спасибо, Lapp и TarasBer, буду исправляться по ти...   1.04.2011 14:47


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

 



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