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

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

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

> Пройти лабиринт по правилу правой руки.
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Нн-дя...
DarkWishmaster, ты извини, но ТАК программировать НЕЛЬЗЯ..
Я впервые вижу такое.. Возвращаемый результат процедуры - параметры цикла!! Где ты это почерпнул?? Я имею в виду сейчас, как ты находишь вход (процедура Enter). Давай разберем. По возрастанию важности ошибок:
1. Зачем делать процедурой кусок кода, который будет использован один раз?
2. Зачем проходить по масиву повторно? Ты мог сделать это при вводе.
3. Нельзя использовать значения параметров цикла вне цикла. Их значения не гарантируются.
4. Параметры цикла должны быть ЛОКАЛЬНЫМИ, то есть описаны внутри процедуры. Только ТР может пропустить такое, всякий нормальный современный компилятор выдаст ошибку.
5. При выполнении п.4 значения i и j будут недоступны в вызывающем модуле.
Я даже и не знаю, что тут еще добавить и какие рекомедации дать. Постарайся сделать выводы сам.
Так, пойду смотреть дальше..

Слушай, DarkWishmaster, ну я же просил тебя уже, кажется: пожалуйста, форматируй код! Ну это же не стихи, где ты можешь писать лесенкой, как тебе вздумается, под Маяковского. Процедура Print - энды пляшут танец с саблями что ли?

Ладно, с меня пока хватит. Я совершенно не понимаю, как можно ТАК УСЛОЖНИТЬ простейшую задачу. Вот тебе код - надеюсь, ты его разберешь. Заметь, что собственно решение занимает в нем 8 строк (в конце).
type
tDir= array [0..3] of integer;

const
u: tDir = (-1,0,1,0);
v: tDir = (0,1,0,-1);

var
maze: array of array of byte;
d,d0,i,j,m,n,x,y,fx,fy: integer;
s: string;
f: text;

begin
// reading the file
Assign(f,'maze.dat');
Reset(f);
n:=0;
while not EoF(f) do begin
ReadLn(f,s);
Inc(n)
end;
m:= Length(s);
SetLength(maze,n+2,m+2);
for i:=0 to n+1 do for j:=0 to m+1 do maze[i,j]:=1;
Reset(f);
for i:=1 to n do begin
ReadLn(f,s);
for j:=1 to m do begin
case s[j] of
'2': begin
x:= i;
y:= j;
end;
'3': begin
fx:= i;
fy:= j;
end
end;
if s[j]<>'1' then maze[i,j]:= 0
end
end;
Close(f);

// printing a picture
for i:=0 to n+1 do begin
for j:=0 to m+1 do Write(maze[i,j]);
WriteLn
end;

// passing the maze
d:= 0;
repeat
d:=(d+1) mod 4;
while maze[x+u[d],y+v[d]]<>0 do d:= (d+3) mod 4;
Inc(x,u[d]);
Inc(y,v[d]);
WriteLn(x:4,y:4)
until (x=fx) and (y=fy);
end.

Пример входного файла:
   1111111
1 11
1 1 11
1 11 1 1
1 1 1
1111111 1
1 1 3
1121111

Размеры прямоугольника - любые. Пробелы (или нули) обязательны (даже в конце строк). В конце файла не должно быть пустых строк!!


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 26.06.2024 22:06
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name