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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2016, 19:37   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Неправильно работает волновой алгоритм.

Задача состоит в том чтобы от начально до конечной проложить пусть в массиве размера 11х6, непроходимые клетки содержат значение -1. Для некоторых начальных и конечных точек алгоритм срабатывает а вот для некотрых нет. Собственно я сейчас поставил координаты точек, для которых чаще не срабатывает, чем срабатывает. Помогите разобраться где я ошибся? Заранее спасибо всем, кто откликнется.

Код:
  //vibiraem nachalo puti
    Golova.X:=2;
    Golova.Y:=5;


  //vibiraem konets puti
    Hvost.X:=8;
    Hvost.Y:=0;

  map1[Golova.X,Golova.Y]:=8;
  map1[Hvost.X,Hvost.Y]:=8;
  //stavim 7 pregrad (tsifri)
  n:=0;
  while (n<7) do
  begin
  Randomize;
  i:=Random(11);
  j:=Random(11);
    if (map1[i,j]=0) and ((i-1<>Golova.X) or (j<>Golova.Y)) and ((i+1<>Hvost.X) or (j<>Hvost.Y)) then
    begin
    map1[i,j]:=1;
    Inc(n);
    end;
  end;

  //poluchaem neprohodimie kletki
  for i:=0 to 10 do
  for j:=0 to 5 do
  if (map1[i,j]<>0) and (map1[i,j]<>8) then put[i,j]:=-1;

  //poluchaem nachalnuyu tochku
  put[Golova.X,Golova.Y]:=1;
  //na sosednih kletkah stavim
  if (Golova.X-1>=0) and (put[Golova.X-1,Golova.Y]=0) then put[Golova.X-1,Golova.Y]:=2;
  if (Golova.X+1<=10) and (put[Golova.X+1,Golova.Y]=0) then put[Golova.X+1,Golova.Y]:=2;
  if (Golova.Y-1>=0) and (put[Golova.X,Golova.Y-1]=0) then put[Golova.X,Golova.Y-1]:=2;
  if (Golova.Y+1<=10) and (put[Golova.X,Golova.Y+1]=0) then put[Golova.X,Golova.Y+1]:=2;

    //zapuskaem volnovoe zapolnenie
    n:=2;
    while n<50 do
    begin
      for i:=0 to 10 do
      for j:=0 to 5 do
      if (Put[i,j]=n) then
      begin
      if (i-1>=0) and (put[i-1,j]=0) then put[i-1,j]:=put[i,j]+1;
      if (i+1<=10) and (put[i+1,j]=0) then put[i+1,j]:=put[i,j]+1;
      if (j-1>=0) and (put[i,j-1]=0) then put[i,j-1]:=put[i,j]+1;
      if (j+1<=5) and (put[i,j+1]=0) then put[i,j+1]:=put[i,j]+1;
      end;
    Inc(n);
    end;

  //poluchaem konechnuyu tochku
  map1[Hvost.X,Hvost.Y]:=8;
  n:=Put[Hvost.X,Hvost.Y];
  XX:=Hvost.X;
  YY:=Hvost.Y;

  //stroim put s kontsa
  while n>1 do
  begin
  Dec(n);
  u:=False;
    if (u=false) and (XX-1>=0) and (put[XX-1,YY]=n) then
    begin
    map1[XX-1,YY]:=8;
    Dec(XX);
    u:=True;
    end;
    if (u=false) and (YY-1>=0) and (put[XX,YY-1]=n) then
    begin
    map1[XX,YY-1]:=8;
    Dec(YY);
    u:=True;
    end;
    if (u=false) and (YY+1<=10) and (put[XX,YY+1]=n) then
    begin
    map1[XX,YY+1]:=8;
    inc(YY);
    u:=True;
    end;
    if (u=false) and (XX+1<=10) and (put[XX+1,YY]=n) then
    begin
    map1[XX+1,YY]:=8;
    inc(XX);
    u:=True;
    end;
  end;
Сам проект тоже прилагаю:
Проект
Armageddets вне форума Ответить с цитированием
Старый 10.05.2016, 17:16   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

п.0 сделать ЭТО получить ОШИБКУ и исправить её.

на всяк случай мой переделанный проект.
1. локальные переменные
2. один массив of record вместо трех
3. рисование там где ему и положено быть (OnPaint) и ВЫКЛЮЧЕН таймер (который ВСЕ равно НИЧЕГО не делал кроме ПОСТОЯННОГО перерисовывания последней и только последней позиции) .
4. как следствие (п.3) "работающая" анимация поиска пути путем использование в некоторых местах всего ДВУХ строк
Код:
Form1.Repaint; // нарисовать
Sleep(100); // и немножко подождать
иногда добавляется третья
ShowMessage(....);

ЗАФИКСИРОВАН набор(положение) препятствий.
и ЗАПУСК теперь только по меню, запуск из FormCreate мешал "анимации" (пока форма не показана, её и не нарисовать)

ОШИБКА работы выявлена, НО НЕ ИСПРАВЛЕНА!!!! но п.0 сделан и ошибка будет показана.
Вложения
Тип файла: zip ошибка волнового алгоритма.zip (5.5 Кб, 10 просмотров)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.05.2016 в 17:30.
evg_m вне форума Ответить с цитированием
Старый 11.05.2016, 08:14   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Задача учебная ? Надо выполнить самому или надо именно чтобы работал поиск пути по волновому алгоритму ? Если второе, я уже много лет успешно использую (ну чуть немного дорабатывал для себя) вот это
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Волновой алгоритм Adelia Паскаль, Turbo Pascal, PascalABC.NET 5 10.11.2014 18:02
Волновой алгоритм! flaminger Помощь студентам 4 05.05.2013 13:04
Волновой алгоритм zokwild Помощь студентам 1 28.11.2012 23:47
волновой алгоритм Delphi The Catalyst Помощь студентам 3 01.12.2011 12:32
Волновой алгоритм поиска Merkator Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 12.02.2009 16:15