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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2008, 16:19   #1
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
По умолчанию 1) Поиск кратчайшего пути в графе методом полного перебора в ширину(очередь)

Поиск кратчайшего пути в графе методом полного перебора в ширину(очередь).
В принципе сама программа готова, в консольном режиме работает все нормально, а вот с Stringrids у меня проблема: вроде все переделано, чтобы программа выдавала результат, а выводит она неправильно ... Помогите пожалуйста найти ошибку.
Код:
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 N do
       StringGrid1.Cells[0,i]:=IntToStr(i);
   for i:=1 to N do
       StringGrid1.Cells[i,0]:=IntToStr(i);
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 queuepush(q,j)
      end;
      inc(j);
    end;
  end;
end;

begin
   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;
   Label1.caption:=IntToStr(finish);
   i:=finish;
   while i<>start do begin
   i:=way[i];
   Label1.Caption:=Label1.Caption + ' ' + IntToStr(i);
   end;
end;


end.
Вложения
Тип файла: rar Прога.rar (192.0 Кб, 66 просмотров)
Serega123 вне форума Ответить с цитированием
Старый 30.10.2008, 19:38   #2
lonsdale
Пользователь
 
Регистрация: 30.10.2008
Сообщений: 14
По умолчанию

чёт у меня прога не скачивается)))Слушай мош мне её на почту скинуть)))плиззз)))
lonsdale вне форума Ответить с цитированием
Старый 30.10.2008, 21:19   #3
Longedok
Пользователь
 
Аватар для Longedok
 
Регистрация: 14.07.2007
Сообщений: 40
По умолчанию

Не всё вы в архивчик положили. Например нет файла road2_.pas. dcu есть, а pas'a нет. Выложите полный проект, работающий и на других компьютерах, тогда может легче вам помочь будет.
Котэ покарает тебя, %username%!

Последний раз редактировалось Longedok; 30.10.2008 в 21:46.
Longedok вне форума Ответить с цитированием
Старый 30.10.2008, 22:26   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Serega123 Посмотреть сообщение
Поиск кратчайшего пути в графе методом полного перебора в ширину(очередь).
В принципе сама программа готова, в консольном режиме работает все нормально, а вот с Stringrids у меня проблема: вроде все переделано, чтобы программа выдавала результат, а выводит она неправильно ... Помогите пожалуйста найти ошибку.
У Вас переменная Way нигде не очищается. В консольном, наверное, она была глобальной. Теперь там мусор и функция visited() работает неправильно.
alexBlack вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Флойда. Поиск Кратчайшего пути. Shady Помощь студентам 5 06.10.2014 18:29