2016-03-03 3 views
0

Я создал консольное приложение C#, которое используется для имитации приложения-робота. я создал 2D сетку для робота передвигаться:Найти ближайшую ценность в сетке 2d C#

List<List<int> Map; 

Карта является 25x25 сетки (для начала) и заполняется со следующими значениями:

0 = Unexplored space, 
1 = Explored space, 
2 = Wall, 
3 = Obstacle, 
9 = Robot 

Робот начинается в положение (12, 12). Я хотел бы иметь возможность искать эту сетку для ближайшего неиспользуемого пространства и возвращать эту позицию, чтобы затем я мог поместить эту позицию и положение роботов в алгоритм поиска A * для планирования.

Каким будет наиболее эффективный метод поиска по карте для указанной стоимости?

Спасибо :)

+0

смотреть на расстоянии формулы -> http://cs.selu.edu/~rbyrd/math/distance/ –

+0

Проблема в том, я не знаю, расположение другой позиции. Сначала мне нужно сначала найти сетку для ближайшей позиции. Я мог бы использовать эту формулу расстояния на каждом «0» в сетке, но я не думаю, что это был бы самый эффективный способ сделать это. –

ответ

2

писал в блокноте, так что я нету проверял, но вы должны получить представление. В основном получите все неисследованные места и отсортируйте их по расстоянию от текущего и получите первое значение в списке. Метод CalculateDistance должен реализовывать формулу Nikola.Lukovic упоминается.

public KeyValuePair<int, int> GetClosestUnexploredPosition(List<List<int>> map, int currentX, int currentY) 
{ 
    Dictionary<KeyValuePair<int, int>, double> unexploredPlaces = new Dictionary<KeyValuePair<int, int>, double>(); 

    foreach (List<int> valueList in map) 
    { 
     foreach (int value in valueList) 
     { 
      if (value == 0) 
      { 
       int x = map.IndexOf(valueList); 
       int y = valueList.IndexOf(value)); 
       if (x != currentX && y != currentY) 
       { 
        unexploredPlaces.Add(new KeyValuePair(x, y), CalculateDistance(currentX, currentY, x, y)); 
       } 
      } 
     } 
    } 

    return unexploredPlaces.OrderBy(x => x.Value).FirstOrDefault(); 
}