Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.06.2010, 17:50
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

Поиск в глубину
Всё привет!
Мне нужно реализовать поле(двумерный массив), в котором есть 4 объекта: 1)свободный путь(это 0) 2)стена(это 1) 3)охотник("S") 4)жертва("G"), то есть охотник должен перед тем как дойти до цели, узнать, где находится жертва, а потом к ней дойти, обходя стены.
Я поспрашивал в инете на форумах и мне подсказали, что для поиска пути в массиве используется "поиски в глубину " и тд, полазив в гугле я нашёл с++ исходник и сразу же переписал его в javascript. Вроде как поиск работает, но охотник не доходит к жертве пару шагов и как мне потом сделать движение по найденному пути , само движение я умею делать, я просто не могу понять как задать найденную траекторию в движении. Очень буду благодарен за вашу помощь.
Исходники с++ и javascript:
Вложения:
Тип файла: zip Поиск в глубину.zip (2.3 Кб, 27 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2010, 18:17
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от lammeR
мне подсказали, что для поиска пути в массиве используется "поиски в глубину "
Поиск не в массиве, а в лабиринте (в графе, если более формально), не важно, как вы его храните в памяти. А алгоритм называется волновой.
Ответить с цитированием
  #3 (permalink)  
Старый 29.06.2010, 18:57
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

Kolyaj,
угу, волновой, в исходнике с++ вроде как реализован волновой алгоритм, а переделанный мною не совсем. В чем загвоздка ?
Ответить с цитированием
  #4 (permalink)  
Старый 29.06.2010, 19:37
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Краткая суть метода волнового алгоритма:
1. Начинаем строить волну из точки назначения или исходящей.
2. создаем массив X x Y где X и Y - размерности (ширина и высота) вышего лабиринта в клетках передвижения.
3. В этом массиве в стартовой точке ставим 0.
4. Вокруг каждого текущего уровня ставим цифры выше уровнем + 1
5. Проверяем попали ли мы в конечную точку или нет. Да - шаг 6. Нет - шаг 4.
6. Найкратчайший путь - от максимальной цифры с поиском уменьшения уровня вокруг и так пока не достигнем 0.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
  #5 (permalink)  
Старый 29.06.2010, 19:42
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

PeaceCoder,
Так вроде как, в моём исходнике так и сделано.

Последний раз редактировалось lammeR, 29.06.2010 в 19:53. Причина: ,
Ответить с цитированием
  #6 (permalink)  
Старый 29.06.2010, 20:10
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Именно и не так. Вы пытаетесь искать путь не найдя конечной точки и там же уже отмечаете +. + должен проставляться аж после нахождения конечной точки (цикл 6).
Кратко ваш алгоритм выдает следующее: есть проход на юг? ставим +. есть проход на юг? ставим + ....... нет прохода ? ставим х и пытаемся искать путь восток/запад/северю
Точ то вы реализовали называется "в обход"
Почитайте вот тут: http://pmg.org.ru/ai/stout.htm
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт

Последний раз редактировалось PeaceCoder, 29.06.2010 в 20:18.
Ответить с цитированием
  #7 (permalink)  
Старый 29.06.2010, 22:59
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

PeaceCoder, спасибо, понял, попытаюсь сделать, покажу потом, что получилось.
Ответить с цитированием
  #8 (permalink)  
Старый 30.06.2010, 18:42
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

Вот получилось, но из-за какой-то ошибки не работает:
var size_row=10;
var size_col=10;
var Ni=0; //номер итерации
var Nk=300; //max кол-во итераций
var y=-1; //точка проходимости
var n=-2; //точка непроходимости
var s=0; //точка старта
var e=254; //точка финиша
var i,j;
var maze=new Array(
	new Array(s,y,y,y,y,y,y,y,n,n),
	new Array(n,y,n,n,n,y,y,y,n,n),
	new Array(y,y,n,n,n,y,n,y,n,n),
	new Array(y,n,n,y,y,y,n,y,n,n),
	new Array(y,y,y,n,n,n,n,y,n,n),
	new Array(n,n,n,n,n,n,n,y,n,n),
	new Array(n,n,n,n,n,n,n,y,n,n),
	new Array(n,n,n,n,n,n,n,y,n,n),
	new Array(n,n,n,n,n,n,n,y,n,n),
	new Array(n,n,n,n,n,n,n,y,y,e)
);


function waveSearch()
{
	
	/*волновой алгоритм*/
	while (Ni < Nk)
	{
	   for (i=0; i < size_row; i++)
	   {
		 for (j=0; j < size_col; j++)
		 /*запуск волны*/
		 if (maze[i][j]==Ni)
		 {
			 if (maze[i][j+1]==-1)maze[i][j+1]=Ni+1;
			 if (maze[i][j-1]==-1)maze[i][j-1]=Ni+1;
			 if (maze[i+1][j]==-1)maze[i+1][j]=Ni+1;
			 if (maze[i-1][j]==-1)maze[i-1][j]=Ni+1;
			 if ((maze[i+1][j]==-2) || (maze[i-1][j]==-2) || (maze[i][j+1]==-2) || (maze[i][j-1]==-2))
			 {
			   
			  // return 0;
			   break;
			 }
		  }
	   }
	Ni++;
	}
	 //вывод массива на экран
	 for(var i=0;i<size_row;i++)
	   {
	   		
			for(var j=0;j<size_col;j++)
			{
				document.write("<span style='width:20px; float:left;'>"+ maze[i][j] +" </span>");
			}
			document.write("<br/>");
	   }
}
waveSearch();
Ответить с цитированием
  #9 (permalink)  
Старый 30.06.2010, 19:48
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Цитата:
maze[i-1][j]==-2
При первой итерации у вас будет отрицательный индекс массива.
Ответить с цитированием
  #10 (permalink)  
Старый 30.06.2010, 23:17
Кандидат Javascript-наук
Отправить личное сообщение для lammeR Посмотреть профиль Найти все сообщения от lammeR
 
Регистрация: 15.01.2010
Сообщений: 138

exec, да, я понял это, но что же делать индекс обязан отниматься, иначе не выйдет распространение волны во все стороны, что просто сделать условие если i<0, то i=0 ???
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слова в исходном коде html страницы klsorat2010 Ваши сайты и скрипты 1 20.05.2010 23:46
Поиск и замена в текстовом поле Roman Koff Events/DOM/Window 12 23.04.2010 23:35
Поиск последнего слова в строке AlexFadeev Элементы интерфейса 3 01.04.2010 18:56
Для чего ограничен поиск? ZoNT Сайт Javascript.ru 4 01.10.2008 15:55
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31