IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Программа лабиринт, помогите составить
sasha45
сообщение 20.12.2006, 18:15
Сообщение #1


Пользователь


Группа: Пользователи
Сообщений: 214
Регистрация: 5.10.2006
Пользователь №: 13 499



Доброго всем времени суток. Нужна ваша помощь. С помощью рекурсии требуется составить программу лабиринт. На диске создается текстовый файл, и заполняется "0" и "1", где "1" - проход, а "0" прохода нет.
лабиринт состоит из массива к примеру 5*5.

Помогите пожалуйста. я в этой рекурсии вообще никак.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 20.12.2006, 18:28
Сообщение #2


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



Условие совсем не понятно wink.gif

Просто случайным образом заполнить нулями и единицами матрицу n*n?

Или какие-то правила всеже есть?


Может наоборот? уже есть файл и надо найти путь от входа до выхода?


--------------------
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sasha45
сообщение 21.12.2006, 19:13
Сообщение #3


Пользователь


Группа: Пользователи
Сообщений: 214
Регистрация: 5.10.2006
Пользователь №: 13 499



Цитата
Может наоборот? уже есть файл и надо найти путь от входа до выхода


да вот именно это.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
afterstep
сообщение 22.12.2006, 8:41
Сообщение #4


Пользователь


Группа: Активисты
Сообщений: 5 336
Регистрация: 14.3.2005
Пользователь №: 2 413



пацталом wink.gif ржунимагу wink.gif и в чем проблемы?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 22.12.2006, 11:19
Сообщение #5


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



afterstep
И не говори, сам не знает, чего хочет biggrin.gif

sasha45
Говорят, если идти вдоль одной из стен, то выйдешь из лабиринта....

Потом можно попробовать лишние круги (тупики) удалить... чтоб не петлять
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
afterstep
сообщение 22.12.2006, 12:41
Сообщение #6


Пользователь


Группа: Активисты
Сообщений: 5 336
Регистрация: 14.3.2005
Пользователь №: 2 413



вообще-то лучше взять книгу - и почитать wink.gif
правило "левой руки" или "правило Эйлера" - если одну руку на входе приложить к стене и не отрывать - то до выхода дойдешь (при условии отсутствия петель - только тупики) - но путь не оптимальный. Нить Ариадны - нить пересекать незьзя. То есть при правильном проходе лабиринта - нить можно вытянуть (нет перехлестов/петель). И самый простой способ - построение графа. И т.д. согласно книге wink.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PolPoll
сообщение 8.1.2009, 13:58
Сообщение #7


:)


Группа: Главные администраторы
Сообщений: 5 858
Регистрация: 24.11.2005
Из: Москва
Пользователь №: 5 327



Цитата(sasha45 @ 20.12.2006, 21:15) *

Доброго всем времени суток. Нужна ваша помощь. С помощью рекурсии требуется составить программу лабиринт. На диске создается текстовый файл, и заполняется "0" и "1", где "1" - проход, а "0" прохода нет.
Например, двойками заполним ячейки, по которым прошли по правилу левой руки

А затем вторым проходом по этому пути пройдем по правилу правой руки - тройками обозначим этот путь

Будем считать, что выход есть smile.gif
если нет, то вернемся в исходную точку - нужно добавить проверку

Код
var
f: text;
n,m,i,j: byte;
labirint: array [0..11,0..11] of byte;
position_x, position_y, napravlenie: byte;
tupik: boolean;

procedure vychod;
var flag: boolean;
begin
  labirint[position_x, position_y]:=2;
  if not ((position_x=n) and (position_y=m)) then
  begin
    flag:=false;
    napravlenie:=(napravlenie + 3) mod 4;
    while not flag do
    begin
      case napravlenie of
       0: if labirint[position_x, position_y+1]<>0 then
          begin
           inc(position_y);
           vychod;
           flag:=true
          end;

       1: if labirint[position_x+1, position_y]<>0 then
          begin
           inc(position_x);
           vychod;
           flag:=true
          end;

       2: if labirint[position_x, position_y-1]<>0 then
          begin
           dec(position_y);
           vychod;
           flag:=true
          end;

       3: if labirint[position_x-1, position_y]<>0 then
          begin
           dec(position_x);
           vychod;
           flag:=true
          end;
      end;
      napravlenie:=(napravlenie + 1) mod 4;
    end;
  end;
end;

procedure vychod2;
var flag: boolean;
begin
  labirint[position_x, position_y]:=3;
  if not ((position_x=n) and (position_y=m)) then
  begin
    flag:=false;
    napravlenie:=(napravlenie + 1) mod 4;
    while not flag do
    begin
      case napravlenie of
       0: if labirint[position_x, position_y+1]=2 then
          begin
           inc(position_y);
           vychod2;
           flag:=true
          end;

       1: if labirint[position_x+1, position_y]=2 then
          begin
           inc(position_x);
           vychod2;
           flag:=true
          end;

       2: if labirint[position_x, position_y-1]=2 then
          begin
           dec(position_y);
           vychod2;
           flag:=true
          end;

       3: if labirint[position_x-1, position_y]=2 then
          begin
           dec(position_x);
           vychod2;
           flag:=true
          end;
      end;
      napravlenie:=(napravlenie + 1) mod 4;
    end;
  end;
end;

begin
  assign(f,'labirint.txt');
  reset(f);
  readln(f,n,m);
  for i:=1 to n do
  begin
    for j:=1 to m do
      read(f,labirint[i,j]);
    readln(f);
  end;
  for j:=0 to m+1 do
   begin labirint[0,j]:=0;labirint[n+1,j]:=0 end;
  for i:=1 to n do
   begin labirint[0,j]:=0;labirint[n+1,j]:=0 end;

  for i:=1 to n do
  begin
    for j:=1 to m do
      write(labirint[i,j]);
    writeln;
  end;
  writeln;


  position_x:=1;
  position_y:=1;
  napravlenie:=0;
  vychod;

  for i:=1 to n do
  begin
    for j:=1 to m do
      write(labirint[i,j]);
    writeln;
  end;
  writeln;

  position_x:=1;
  position_y:=1;
  napravlenie:=0;
  vychod2;

  for i:=1 to n do
  begin
    for j:=1 to m do
      write(labirint[i,j]);
    writeln;
  end;


  readln;
end.


Текстовый файл labirint.txt
Код
4 6
1 0 1 0 1 1
1 0 1 1 1 0
1 1 1 0 1 1
0 0 1 1 0 1


для denizk smile.gif из темы "Игры на Delphi" http://www.opeople.ru/ipb.html?s=&showtopi...ndpost&p=196215


--------------------
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 8.1.2009, 16:59
Сообщение #8


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



PolPoll, Спасибо,завтра попробую наваять.) smile.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 



- Текстовая версия Сейчас: 22.5.2012, 9:54