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
сообщение 30.03.2011 18:17
Сообщение #2


Бывалый
***

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

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



Program Robot_Greedy; Uses Crt;
const
dx : array [0 .. 3] of integer = (1, 0, -1, 0);
dy : array [0 .. 3] of integer = (0, 1, 0, -1);
type matrice=array[1..100,1..100] of integer;
var
a,b:matrice;
i,j,n,m,x,y,d,flag:integer; F:text;
Robot: record
x, y, direction: integer;
end;
procedure Enter; {Find Entrance}
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);
for i:=1 to n do
for j:=1 to n do
if a[i,j]=0 then b[i,j]:=0 else b[i,j]:=-1; end; {Initiare}
procedure Print(var a:matrice);
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 Free(i,j:integer):boolean;
begin
Free:=(a[i,j]=0) and (i<n) and (j<m);
end; {Free}
procedure GO;
begin
i:=i+dx[robot.direction];
j:=j+dy[robot.direction];
b[i,j]:=b[i,j]+1;
end;
procedure Back;
begin
i:=i-dx[robot.direction];
j:=j-dy[robot.direction];
b[i,j]:=b[i,j]+1;
end;
procedure Right90;
begin
if robot.direction=3 then robot.direction:=-1;
robot.direction:=robot.direction+1;
end;
procedure Left90;
begin
if robot.direction=0 then robot.direction:=4;
robot.direction:=robot.direction-1;
end;
Begin ClrScr; {Main Program}
Initiare;
Print(a);
readln;
Enter;
x:=i; y:=j;
robot.direction:=2;
while Free(i,j) do
Go;
while flag=0 do begin
Right90;
Go;
if a[i,j]=3 then flag:=1 else
if not(Free(i,j))then begin
Back;
Left90;
Go;
if not(free(i,j))then begin
Back;
Left90;
end
end
end;

Print(b);
readln;
end.


//File In.TXT
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
// Matrix B
-1 1 0 -1 1 0 0 1 0
0 5 6 4 4 2 3 6 2
0 4 4 4 1 -1 2 4 0
0 3 2 1 -1 0 1 4 2
0 2 -1 0 -1 0 -1 2 1
0 2 0 0 0 0 -1 3 1
0 0 -1 -1 -1 -1 -1 2 0





Вот что получилось, робот находит выход, только он идёт по очень длиному пути.
Пробовал использовать матрицу B для генерации ответа ( надо пройти по минимальным числам ), но это не получилось...

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