[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск кратчайшего пути в базе данных
ADiel
Всем привет. Мне нужно сделать поиск пути, но я не представляю как.
Значит есть игровое поле, разбитое на клетки.
   
1 2 3 4 5 6 7 8 9

1 * *

2

3

4 *

5

6

7

8

9

Допустим * - это объект на поле. В базе данных записывается так:

id, x, y
1 1 1
2 2 4
3 3 1



Допустим, этих объектов намного больше и мне нужно получить список клеток, по которым можно построить линию в обход этих объектов по кратчайшему пути.

Для пустых клеток значений в базе нет.
Так вот. Как это делается? Можно ли воспользоваться sql запросом, что бы не выбирать все поля? (координатная сетка может быть огромной)

Даже если я выбрал все поля, как реализуется такой алгоритм?
Я уверен, что есть такие, названные в честь создателей :)



Спустя 2 минуты, 28 секунд (27.03.2012 - 19:04) ADiel написал(а):

Спустя 2 минуты, 58 секунд (27.03.2012 - 19:07) ADiel написал(а):

Спустя 33 минуты, 24 секунды (27.03.2012 - 19:41) johniek_comp написал(а):
На втором курсе учил дискретную математику, это графы и деревья можешь погуглить, код не найдешь, но алгоритм точно smile.gif М-да видать много я прогулял дискретку smile.gif

Спустя 3 минуты, 46 секунд (27.03.2012 - 19:45) johniek_comp написал(а):
ADiel
Ты подробнее объясни что куда должно обходить, а то не понятно совсем по какому принципу обходить?

Спустя 6 минут, 5 секунд (27.03.2012 - 19:51) ADiel написал(а):
Мое третее сообщение - то, что нужно.
http://www.tarikattar.com/napier/osmastermap/ Вот готовое, но у меня не открывается почему то. Там php + google maps

полез в webarhive вытаскивать =)

Спустя 8 минут, 29 секунд (27.03.2012 - 19:59) johniek_comp написал(а):
Сначала засунь x,y в массив
x = [1,2,3,4,5,6,7,8,9];
y = [1,2,3,4,5,6,7,8,9];

потом высчитай все возможные координаты 1:1 1:2 ...8:9 9:9

удали те координаты которые у тебя заданы, например 3:4 7:9, с оставшихся координат собери самые маленькие. и будет тебе обход

Спустя 3 минуты, 40 секунд (27.03.2012 - 20:03) ADiel написал(а):
Цитата (johniek_comp @ 27.03.2012 - 16:59)
Сначала засунь x,y в массив
x = [1,2,3,4,5,6,7,8,9];
y = [1,2,3,4,5,6,7,8,9];

потом высчитай все возможные координаты 1:1 1:2 ...8:9 9:9

удали те координаты которые у тебя заданы, например 3:4 7:9, с оставшихся координат собери самые маленькие. и будет тебе обход

Что значит самые маленькие?

Спустя 11 минут, 13 секунд (27.03.2012 - 20:14) johniek_comp написал(а):
ADiel
Если есть препятствие то нужно обходить с рядом стоящей координатой!
user posted image

я не знаю как объяснить, но я раньше такое делал, может рисунок поможет

Спустя 24 минуты, 15 секунд (27.03.2012 - 20:38) inpost написал(а):
Сделал. 50 строк кода. Время создания скрипта: ~30 минут.
Скорость работы:
0.00013305114746094 , как 1 запрос к мускулу smile.gif Я проверял на координатах 10х10, на самых дальних дистанциях.

ADiel
Если не решил, то можешь стукнуть в скайп мне smile.gif

Спустя 5 минут, 52 секунды (27.03.2012 - 20:44) ADiel написал(а):
inpost
В аську стукнул.

Спустя 6 часов, 25 минут, 1 секунда (28.03.2012 - 03:09) ADiel написал(а):
Вот моя почти готовая реализация.
Т.к. долго не спал, не могу понять, где зацикливается. Помогите понять =)))

<style>
table {
border-spacing: 0;
}
td {
border: 1px solid black;
}
</style>
<?php
class
Route {
// Полная карта
private $map = array();
// Точки
public $a = array(2,2);
public $b = array(10,13);
// Маршруты
public $routes = array();
public $routesCnt = array();
//
public $scores = array();

public $i;

function __construct($size=10, $occupancy=10){
for($x = 1; $x<=$size; $x++)
for($y = 1; $y<=$size; $y++){
$this->map[$x][$y] = rand(0,$occupancy) ? 0 : 1;
$this->scores[$x][$y] = 0;
}
}


public function getNext($x,$y){

$xval = 0; // Смещение по x
$yval = 0; // Смещение по y

$relev = array(); // Массив релевантности

// Если текущая точка левее

if ($x > $this->b[0]) $xval--;
// Правее
elseif ($x < $this->b[0]) $xval++;
// Выше
if ($y > $this->b[1]) $yval --;
// Ниже
elseif ($y < $this->b[1]) $yval++;
// Пришли к конечной точке
if (!$xval && !$yval) return array($x,$y);

// Пустая точка со смещением только по Y
if(!$this->map[$x][$y+$yval]){
// Записываем релеватность точки в массив выбора
$relev[$this->scores[$x][$y+$yval]]=array($x,$y+$yval);
}
// Пустая точка со смещением только по X
if(!$this->map[$x+$xval][$y]){
$relev[$this->scores[$x+$xval][$y]]=array($x+$xval,$y);
}

// Пустая точка по диагонали
if(!$this->map[$x+$xval][$y+$yval]) {
$relev[$this->scores[$x+$xval][$y+$yval]]=array($x+$xval,$y+$yval);
}



// Если нет точек, на которые можно перейти
if (empty($relev))
// Отправляем сигнал завершения итераций
return false;
$this->routes[$this->i][] = $relev[min(array_keys($relev))];
return $relev[min(array_keys($relev))];
}


public function go($iters=0){
$this->i = 0;
$iters++;
$x = $this->a[0];
$y = $this->a[1];

if (isset($this->scores[$x][$y]))
$this->scores[$x][$y]+=1;
while($this->i<5){


if ($iters*$this->i > 200)
die("to many");

if (!isset($this->routes[$this->i])){
$this->routes[$this->i] = array();
}

if ($x == $this->b[0] && $y == $this->b[1]){
$x = $this->a[0];
$y = $this->a[1];
$this->routesCnt[$this->i] = count($this->routes[$this->i]);
$this->i++;
continue;
}

$res = $this->getNext($x, $y);

if (is_array($res)) {
list ($x, $y) = $res;
$this->scores[$x][$y]+=2;
}

}

echo "<pre>";
print_r($this->routesCnt);
echo "</pre>";
}

public function getColor($val){
$r = 255;
$g = 255;
$b = 255;
if ($val){
$r = round(($val - 1)/(20-1)*255);
$g = round((25 - $val)/(20-1)*255);
$b = 1;
}
return "rgb($r,$g,$b)";
}

public function show(){
echo "<table>";
foreach ($this->map as $x=>$item){
echo "<tr>";
foreach ($item as $y=>$itm){
$bg = 'white';
if ($itm == 1)
$bg = 'gray';
else
$bg = $this->getColor($this->scores[$x][$y]);
if ($x == $this->a[0] && $y==$this->a[1])
$bg = 'yellow';
if ($x == $this->b[0] && $y==$this->b[1])
$bg = 'gold';
echo "<td style='background: {$bg};'>{$x}:{$y}</td>";
}
echo "</tr>";
}
echo "</table><pre>";
//print_r($this->map);
//print_r($this->scores);

echo "</pre>";
}
}


$route = new Route(14,10);
$route->go();
$route->show();


_____________
Ищи меня тут (ilyaplot)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.