Регистрирайте се безплатно, за да използвате услугите на сайта! | Вход
Начало Новини ИТ Работа Форум Видео Уроци Скриптове WiFi точки MyLinks Mytech Още


Нова тема
Намиране на най-кратък път
Тази тема е погледната 179 пъти
Добави темата към любими | Принтирай темата | Нова тема 
Публикувано на: 29.11.2008 12:56
HunteR666
Ронин

Мнения: (22)

Здравейте, правя си карта за игра.

Ето я ->

Сега ще обясня какво точно искам :)

Да кажем, че се намирам на координати: X:4 Y:4 - това е червеното квадратче.

Целта ми е да стигна до лилавото - X:4 Y:6. Въпросът, е че човечето трябва да успее да намери най-краткия път до това квадратче. Както съм го и отбелязал с кафявите квадратчета.

Всички черни квадрати са препятствия. Човечето няма право да минава през тях, а да ги заобиколи като се има в предвид, че може да се движи само наляво, надясно, нагоре и надолу, но не и по диагонал.

Така и имам още един въпрос.

Както виждате на картата горе в дясно имам още 4 препятствия - X:10 Y:9, X:9 Y:10, X:11 Y:10 и X:10 Y:11.
Така и да кажем, че искам да ида на X:10 Y:10. Искам да изведе грешка, защото няма как да мине до там.

Също ако може да не е с класове, че нещо изобщо не мога да ги вдена :D

Благодаря предварително на отзовалите се :)

П.П: Прочетох за алгоритъм на Дейкстра, на Флойд и на Форд Белман, но нещо не ги сванах. Ако някой може да ги надраска на PHP по възможност без класове ще съм му мн благодарен :)


 
---------------------------
Потребител от: 19.06.08 | Всички уроци от HunteR666 | Всички скриптове от HunteR666
напиши eMail напиши лично съобщение виж профила на HunteR666
Публикувано на: 09.01.2009 08:41
tommy_too
Чирак

Мнения: (6)

Ще нахвърля първоначални идеи по задачката които едва ли са много далновидни ,но могат да отключат отговора към подходящия алгоритъм за решаването на задачката.
Приемам че имаш директен достъп до елементите чрез индекси , ако нямаш тогава е нужно да се промени алгоритъма.Преминаваш последователно през всеки ред от масива (или там в каквато структура са организирани данните) и правиш проверка за наличието на черно поле на долния ред в дясно и ляво , ако не съществуват (т.е са null) все едно пак е черно поле (неможе да се мине оттам).Проверката ти ще бъде :
 if ( current == 'white' ) : проверяваш
    дали (mass[$x][$y-1] == 'черно' OR $y-1 e извън масива) AND
    дали (mass[$x-1][$y] == 'черно' OR $x-1 e извън масива) AND
    .....
И така с едно преминаване през масива ще знаеш дали има такива блокажи и ако има вземаш мерките.
Относно най-краткия път.Мисля си  за един не толкова оптимален начин
за намирането му чрез рекурсия .Тези дни като поостане малко време ще го измисля и ще ти го пост-на.


 
---------------------------
Потребител от: 23.01.08 | Всички уроци от tommy_too | Всички скриптове от tommy_too
напиши eMail напиши лично съобщение виж профила на tommy_too
Публикувано на: 09.01.2009 10:59
FlyAway
Ронин

Мнения: (57)

Аз съм правил преди години нещо много подобно дори беше по-сложно.
В случая може да стане ако приемеш че всяко квадратче през което може да се премине е възел от граф. Свързваш всички възли двупосочно и задаваш на връзките едно и също тегло, някаква константа - да речем 1.
Използваш алгоритъма на Дейкстра като задаваш началото и края на пътя. Така със сигурност работи стига да имаш добра имплементация на алгоритъма на Дейкстра. Аз си написах такава и работи доста бързо, но е на C++ (с класове ). Въпреки това лесно се използва без да е необходимо да разглеждаш кода.
Това е PHP/Perl/ASP форум но идеята която описах не зависи от езика.


 
---------------------------
Потребител от: 18.08.08 | Всички уроци от FlyAway | Всички скриптове от FlyAway
напиши eMail напиши лично съобщение виж профила на FlyAway
Публикувано на: 09.01.2009 11:08
FlyAway
Ронин

Мнения: (57)

За да не разбереш погрешно, като казах "свързваш всички възли двупосочно" имам превид че само хоризонтално и вертикално.

Например:

0-0-0-0-0
| | | | |
0-0-0-0-0
| 8 8 8 |
0-0-0-0-0


0 и 8 са съответно зелен и черен квадрат (възли в графа)

- и | са двупосочни връзки с тегло 1.

Всъщност 8 въобще не съществуват в графа. Показах ги само за да е по-ясно.


 
---------------------------
Потребител от: 18.08.08 | Всички уроци от FlyAway | Всички скриптове от FlyAway
напиши eMail напиши лично съобщение виж профила на FlyAway
 1 посетител чете тази тема (0 потребители и 1 гост)  
Активни потребители: ---
   




mytech.bg © 2004 - 2009 | Контакти | За реклама