Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2011, 12:52   #1
keng
Новичок
Джуниор
 
Регистрация: 11.09.2011
Сообщений: 2
По умолчанию Лабиринт

Здравствуйте!Помогите пожалуйста с курсовым по Паскалю!Задание примерно состоит в том чтобы сделать программу которая ищет выход из лабиринта.Самому простейшему варианту буду очень рад(желательно с комментариями)Заранее спасибо
PSочень очень надо
keng вне форума Ответить с цитированием
Старый 11.09.2011, 13:13   #2
fizteh
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 46
По умолчанию

Готов помочь, за небольшую плату.
icq: 265879269
e-mail: stic55@mail.ru
fizteh вне форума Ответить с цитированием
Старый 12.09.2011, 04:26   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от fizteh Посмотреть сообщение
Готов помочь, за небольшую плату.
icq: 265879269
e-mail: stic55@mail.ru
Ты не заметил, что раздел - не фриланс? некрасиво. А еще физтех..

keng, давай начнем с описания лабиринта. Уточни - какой он? Двумерный? На квадратной сетке?
Есть у тебя хоть какие-то наработки или соображения? Высказывай, anything would do.
Когда уточнишь условия, можно будет начинать решать.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 12.09.2011, 08:52   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от keng Посмотреть сообщение
Здравствуйте!Помогите пожалуйста с курсовым по Паскалю!Задание примерно состоит в том чтобы сделать программу которая ищет выход из лабиринта.Самому простейшему варианту буду очень рад(желательно с комментариями)Заранее спасибо
PSочень очень надо
Есть готовая курсовая работа реализующая функции:
1. Генерация случайного лабиринта.
2. Поиск выхода различными методами.
3. Графическое отображение процесса поиска.

Единственное что он написан наверноена С++ ... точно не помню.

Начните решение с чего-нибудь, а дальше поможем.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 12.09.2011, 21:04   #5
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от keng Посмотреть сообщение
Здравствуйте!Помогите пожалуйста с курсовым по Паскалю!Задание примерно состоит в том чтобы сделать программу которая ищет выход из лабиринта.Самому простейшему варианту буду очень рад(желательно с комментариями)Заранее спасибо
PSочень очень надо
могу сделать, пиши в аську или на почту
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 13.09.2011, 11:32   #6
keng
Новичок
Джуниор
 
Регистрация: 11.09.2011
Сообщений: 2
По умолчанию

У меня есть некоторые мысли но нужно в одну их собрать(может кто поможет
Например, данный лабиринт можно описать в разделе CONST (описания констант) следующим образом:


Код:
const
lab: array[0..6,0..6] of byte =
((0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 1, 0, 0, 0),
(0, 1, 1, 1, 1, 1, 0),
(0, 0, 1, 0, 0, 1, 0),
(0, 1, 1, 1, 1, 1, 0),
(0, 1, 1, 0, 1, 1, 0),
(0, 0, 0, 0, 0, 0, 0));
Путь можно хранить в двумерном массиве, например

Код:
way: array[1..200,1..2] of integer;
Рекурсивная процедура выглядит примерно так:
Код:
procedure find(x,y: integer);
begin
if (x=xk)and(y=yk) then begin
writeln;
writeln('there is a way');
readkey halt
end;
lab[x,y]:=2;
if lab[x+1,y]=1 then find(x+1,y);
if lab[x-1,y]=1 then find(x-1,y);
if lab[x,y-1]=1 then find(x,y-1);
if lab[x,y+1]=1 then find(x,y+1);
lab[x,y]:=1
end;
Никак не могу это все объеденитьь!ПОмогите пожадуйста мне уже завтра сдавать(((


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 13.09.2011 в 12:29.
keng вне форума Ответить с цитированием
Старый 13.09.2011, 16:29   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Выкладывал пару раз простенький лабиринт для небольшого размера.По ноликам ходим, 1-стена. Решение ужасно не оптимальное, зато короткое )
Код:
const mas:array[0..9,0..9]of integer=(
 (1,1,0,1,1,1,1,1,1,1)
,(1,1,0,1,1,1,1,1,1,1)
,(1,1,0,0,1,0,0,0,1,1)
,(1,1,1,0,0,0,1,0,1,1)
,(1,0,1,1,1,0,0,0,1,1)
,(1,0,0,0,0,0,1,1,1,1)
,(1,1,1,1,1,0,1,1,1,1)
,(1,1,1,1,1,0,0,0,1,1)
,(1,1,1,1,1,1,1,1,1,1)
,(1,1,1,1,1,1,1,1,1,1));

X1=5; Y1=1; x2=2; y2=2;

function inttostr(a:integer):string;
var s: string;
begin str(a, s); inttostr:=s end;

procedure MakeList(x, y: integer; s:string);
begin
    s:=s+'['+inttostr(x)+','+inttostr(y)+']-';
    if (x=X2) and (y=Y2) then
    begin
        writeln(s);
        exit
    end;
    if (x > 0) then if (mas[x - 1][y] = 0) then begin inc(mas[x][y],3); MakeList(x-1, y, s); dec(mas[x][y],3) end;
    if (x < 9) then if (mas[x + 1][y] = 0) then begin inc(mas[x][y],3); MakeList(x+1, y, s); dec(mas[x][y],3) end;
    if (y > 0) then if (mas[x][y - 1] = 0) then begin inc(mas[x][y],3); MakeList(x, y-1, s); dec(mas[x][y],3) end;
    if (y < 9) then if (mas[x][y + 1] = 0) then begin inc(mas[x][y],3); MakeList(x, y+1, s); dec(mas[x][y],3) end;
end;

begin
    MakeList(x1, y1, '');
    readln
end.
eoln вне форума Ответить с цитированием
Старый 13.09.2011, 21:02   #8
jetyb
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 22
По умолчанию

Представь что капнул каплю воды на вход плоского лабиринта и она растекается по всей поверхности. Каждую секунду она движется на один шаг или, что равносильно, присоединяет некоторое кол-во клеток. Если выход есть, то рано или поздно капля присоединит и клетку с выходом. Соответственно для каждой доступной клетки можно узнать на какой ходу она была присоединена. Дальше думай...
jetyb вне форума Ответить с цитированием
Старый 13.09.2011, 21:05   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от jetyb Посмотреть сообщение
Представь что капнул каплю воды на вход плоского лабиринта и она растекается по всей поверхности. Каждую секунду она движется на один шаг или, что равносильно, присоединяет некоторое кол-во клеток. Если выход есть, то рано или поздно капля присоединит и клетку с выходом. Соответственно для каждой доступной клетки можно узнать на какой ходу она была присоединена. Дальше думай...
Радиальный метод.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 14.09.2011, 06:34   #10
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

До кучи, выкладываю реализацию алгоритма "одной руки", левой или правой, как хотите.. )) Еще он называется Wall Follower (преследующий стену). Конечно, он далеко не самый оптимальный. Более того, он находит только один путь и не в состоянии найти кратчайший. Но тоже короткий в реализации, причем даже без рекурсии )).

В проге лабиринт заполняется случайным образом с заданной плотностью заполнения стенами. Вывод картинки в тектовой моде. Алгоритм (словесный) могу добавить по запросу.
Код:
// Wall Follower, or one-hand rule
// by TinMan, programmersforum.ru

const
  m= 24;
  n= 60;
  Fill= 35;  // плотность заполнения
  x1= 1;
  y1= 1;
  x2= m;
  y2= n;
  Wall= 8;
  Chars: array[0..Wall] of char= ' ****   '+Chr(219);

var
  Maze: array[1..m,1..n] of integer;

procedure Show;
var
  i,j: integer;
begin
  WriteLn;
  for i:=0 to m+1 do begin
    for j:=0 to n+1 do begin
      if (i=0) or (i>m) or (j=0) or (j>n) then Write(Chr(219))
      else if (i=x1) and (j=y1) then Write('A')
      else if (i=x2) and (j=y2) then Write('B')
      else Write(Chars[Maze[i,j]])
    end;
    Writeln
  end;
  WriteLn
end;

var
  x,y,dx,dy,b: integer;
  s: string;

begin
  Randomize;
  for x:=1 to m do for y:=1 to n do
    if Random(100)<=Fill then Maze[x,y]:= Wall else Maze[x,y]:= 0;
  Maze[x1,y1]:= 0;
  Show;
  x:= x1;
  y:= y1;
  dx:= 0;
  dy:= 1;
  repeat
    if (x<1) or (y<1) or (m<x) or (n<y) or (Maze[x,y]=Wall) then begin
      dx:= -dx;
      dy:= -dy
    end
    else if (x=x2) and (y=y2) then begin
      s:= 'Escaped! :-)  Hei stupid Minotaur - kiss my ass!';
      break
    end
    else if Maze[x,y]=4 then begin
      s:= 'No way.. :-(  The mean Minotaur got me..';
      break
    end
    else begin
      Inc(Maze[x,y]);
      b:= dx;
      dx:= -dy;
      dy:= b
    end;
    x:= x+dx;
    y:= y+dy
  until false;
  Writeln(s);
  Show;
  Readln
end.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабиринт. ValinRam Помощь студентам 1 01.05.2011 08:47
Лабиринт GBTA Общие вопросы C/C++ 2 08.07.2010 12:03
Лабиринт Claster Помощь студентам 1 02.03.2009 11:41
Лабиринт)) Whiplash Паскаль, Turbo Pascal, PascalABC.NET 2 04.12.2008 17:12