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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
DarkWishmaster
сообщение 28.03.2011 21:07
Сообщение #2


Бывалый
***

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

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


Вообщем вот что получилось:

Program Robot; Uses Crt;
var a:array[1..100,1..100] of integer;
i,j,n,m,x,y,flag:integer; F:text; Q:boolean;
procedure Enter;
begin
for i:=1 to n do
for j:=1 to m do
if a[i,j]=2 then exit;
end; {Enter}
procedure Initiare;
begin
assign(F, 'C:\In.TXT'); reset(F);
read(F, n); readln(F, m);
for i:=1 to n do begin
for j:=1 to m do begin
read(F,a[i,j]);
end;
readln(F);
end;
close(F);
end; {Initiare}
procedure Print;
var i,j:byte;
begin
for i:=1 to n do begin
for j:=1 to m do begin
write(a[i,j]); end;
writeln;
end; {Print} end;
function Block(i,j:integer):boolean; // смотрим если можно идти вперёд
begin
if (a[i,j]=1) or (i>n) or (j>m) then Block:=True
else Block:=False;
end; (*BlocK*)
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(var i,j:integer); // шаг вперед
begin
i:=i+x;
j:=j+y;
end; {move}
function Exit(i,j:integer):boolean; // проверка на выход
begin
if a[i+x,j+y]=3 then Exit:=True else Exit:=False;
end;
Begin ClrScr;
Initiare;
Enter;
x:=-1; y:=0;
flag:=1;
repeat
if Block(i+x,j+y)=True then //если впереди блок тогда
begin
RotD; // поворачиваем направо
if Block(i+x,j+y) // если и на право блок то
then while Block(i+x,j+y)=True do // поворачиваем налево до тех пор пока найдем свободное пространство
RotS
else Move(i,j); // если после поворота направо нету блока то шаг вперед
end else Move(i,j); //если впереди нету блока то шаг вперед
until Exit(i,j)=True; // выполнять пока не найдем выход
readln;
end.



Для примера массива что я написал выше, он идёт наверх, поворачивает, видет что там тупик, и идёт в обратном направлении пока дойдёт до входа, и опять всё заново sad.gif((

З.Ы , как тут спойлер написать? что-бы можно было свернуть весь код.

Там откуда я взял задачу, она по техники Greedy, и есть Подсказка: Выбирать из Множество [Вниз, Вверх, Направо, Налево] так что-бы робот двигался вдоль одной стены.

Сообщение отредактировано: DarkWishmaster - 28.03.2011 21:12
 Оффлайн  Профиль  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 14:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"