Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
| 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 |
Условие совсем не понятно
Просто случайным образом заполнить нулями и единицами матрицу 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 |
пацталом
|
| PolPoll |
22.12.2006, 11:19
Сообщение
#5
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
afterstep
И не говори, сам не знает, чего хочет sasha45 Говорят, если идти вдоль одной из стен, то выйдешь из лабиринта.... Потом можно попробовать лишние круги (тупики) удалить... чтоб не петлять |
| afterstep |
22.12.2006, 12:41
Сообщение
#6
|
|
Пользователь Группа: Активисты Сообщений: 5 336 Регистрация: 14.3.2005 Пользователь №: 2 413 |
вообще-то лучше взять книгу - и почитать
правило "левой руки" или "правило Эйлера" - если одну руку на входе приложить к стене и не отрывать - то до выхода дойдешь (при условии отсутствия петель - только тупики) - но путь не оптимальный. Нить Ариадны - нить пересекать незьзя. То есть при правильном проходе лабиринта - нить можно вытянуть (нет перехлестов/петель). И самый простой способ - построение графа. И т.д. согласно книге |
| PolPoll |
8.1.2009, 13:58
Сообщение
#7
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Доброго всем времени суток. Нужна ваша помощь. С помощью рекурсии требуется составить программу лабиринт. На диске создается текстовый файл, и заполняется "0" и "1", где "1" - проход, а "0" прохода нет. А затем вторым проходом по этому пути пройдем по правилу правой руки - тройками обозначим этот путь Будем считать, что выход есть если нет, то вернемся в исходную точку - нужно добавить проверку Код 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 -------------------- |
| denizk |
8.1.2009, 16:59
Сообщение
#8
|
![]() Пользователь Группа: Активисты Сообщений: 654 Регистрация: 31.10.2007 Пользователь №: 18 005 |
PolPoll, Спасибо,завтра попробую наваять.)
|
![]() ![]() |
|
Текстовая версия | Сейчас: 22.5.2012, 9:54 |