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

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Кратчайший путь в графе
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Серёга

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


Помогите пожалуйста с программкой:
"Поиск кратчайшего пути в графе методом полного перебора в ширину с использованием АТД очередь"
Сам алгоритм у меня есть, но ничего не знаю про АТД очередь, ни у кого нет примеров такой программы?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
работать с очередями, стеками и деками целый семестр, поэтому хотелось бы поподробнее.
Что именно "поподробнее"? Ты ж сказал, что у тебя есть алгоритм, но ты не знаешь про очереди. Все, что тебе надо знать - это то, что есть операции Put и Get, все остальное - уже детали реализации (на то он и абстрактный тип данных).

Цитата
Мне дан такой алгоритм:
Не-не... Ты перепутал все на свете... Это не процедура называется Quepush... Вот так выглядит программа в простейшем случае:

uses queue_oop;

const
N = 6;
M: array[1 .. N, 1 .. N] of integer = (
(0, 2, 0, 8, 0, 0),
(0, 0, 3, 0, 7, 0),
(0, 0, 0, 0, 1, 0),
(0, 0, 0, 0, 6, 0),
(0, 0, 0, 0, 0, 4),
(0, 0, 0, 0, 0, 0)
);

type
WayType = array[1 .. N] of integer;

function visited(what: integer; path: WayType): boolean;
var i: integer;
begin
visited := true;
for i := low(path) to high(path) do
if path[i] = what then exit;
visited := false;
end;

var
q: TQueue;
i, j, start, finish, current: integer;
finished: boolean;
Way: WayType;

begin
q.init;

start := 1; finish := 5;

q.put(start);
While not q.isEmpty do begin
Current := q.get;
Finished := Current = finish;
j:=1;
while j<=N do begin
if (M[Current,j] <> 0) and not visited(j, way) then begin
Way[j] := Current;
Finished:=(j = finish);
// если не закончили перебор - добавляем очередную вершину
// в очередь, чтобы потом к ней вернуться...
if not Finished then q.put(j)
end;
inc(j);
end;
end;

// а когда закончили - то печатаем путь
// от конечной вершины к начальной
i:=finish;
write(i:3);

while i<>start do begin
write(Way[i]:3);
i:=Way[i];
end;
writeln;

end.

(я использовал собственный модуль queue_oop, в принципе можешь использовать любой другой, по названиям методов понятно, что они делают: Put - забрасывает элемент в конец очереди, Get - вытаскивает элемент из ее начала)

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Серёга

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


Спасибо большое, сейчас буду разбираться!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 37
Пол: Мужской
Реальное имя: Серёга

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


Вроде всё понятно, немного модифицировал программу, но начала вылезать ошибка, не понимаю почему...
Ошибка отправляет меня в эту строчку:

 Function QueuePop(var q:TQueue):TElem;
var
z:TList;
begin
z:=q.head;
q.head:=z^.next;
QueuePop:=Z^.info;
dispose(z)
end;


Вот сама программа:

unit road2_;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, Queue;

const
N=6;{ кол-во вершин графа}
type
WayType = array[1 .. N] of integer;

TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Label4: TLabel;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
// нумерация строк
for i:=1 to 10 do
StringGrid1.Cells[0,i]:=IntToStr(i);
// нумерация колонок
for i:=1 to 10 do
StringGrid1.Cells[i,0]:=IntToStr(i);
// описание предопределенной карты
StringGrid1.Cells[1,2]:='1';
StringGrid1.Cells[2,1]:='1';
StringGrid1.Cells[1,3]:='1';
StringGrid1.Cells[3,1]:='1';
StringGrid1.Cells[1,4]:='1';
StringGrid1.Cells[4,1]:='1';
StringGrid1.Cells[3,7]:='1';
StringGrid1.Cells[7,3]:='1';
StringGrid1.Cells[4,6]:='1';
StringGrid1.Cells[6,4]:='1';
StringGrid1.Cells[5,6]:='1';
StringGrid1.Cells[6,5]:='1';
StringGrid1.Cells[5,7]:='1';
StringGrid1.Cells[7,5]:='1';
StringGrid1.Cells[6,7]:='1';
StringGrid1.Cells[7,6]:='1';
end;


procedure TForm1.Button1Click(Sender: TObject);
var
M:array[1..N,1..N] of integer;
q: TQueue;
i, j, start, finish, current: integer;
finished: boolean;
Way: WayType;

function visited(what: integer; path: WayType): boolean;
var i: integer;
begin
visited := true;
for i := low(path) to high(path) do
if path[i] = what then exit;
visited := false;
end;

procedure step;
begin
queueinit(q);
queuepush(q,start);
While not queueEmpty(q) do begin
Current := queuepop(q);
Finished := Current = finish;
j:=1;
while j<=N do begin
if (M[Current,j] <> 0) and not visited(j, way) then begin
Way[j] := Current;
Finished:=(j = finish);
if not Finished then queuepop(q)
end;
inc(j);
end;
end;
i:=finish;
while i<>start do begin
i:=Way[i];
end;
Label1.Caption:=label1.Caption+' '+IntToStr(way[i]);
end;

begin
Label1.caption:='';

for i:=1 to N do
for j:=1 to N do
if StringGrid1.Cells[i,j] <> ''
then M[i,j]:=StrToInt(StringGrid1.Cells[i,j])
else M[i,j]:=0;
start:=StrToInt(Edit1.text);
finish:=StrToInt(Edit2.text);
step;

end;

end.


и прикреплен юнит с Объектом очередь, скачан отсюда, с форума

Сообщение отредактировано: SeregaR1Val -


Прикрепленные файлы
Прикрепленный файл  QUEUE.pas ( 1018 байт ) Кол-во скачиваний: 258
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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