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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 1.04.2011 8:06
Сообщение #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 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:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"