Получить смежные элементы в двухмерной антенной решетке?

Я имею двухмерную антенную решетку, говорю

0 0 0 0 0
0 2 3 4 0
0 9 1 5 0
0 8 7 6 0
0 0 0 0 0

И я должен получить все числа, смежные с 1 (2, 3, 4, 5, 6, 7, 8, 9)

Есть ли менее ужасное решение, чем:

topLeft = array[x-1][y-1]
top  = array[x][y-1]
topRight = array[x+1][y-1]
# etc

Спасибо!

21
задан Nick Dandoulakis 10 January 2010 в 00:35
поделиться

4 ответа

Если вас не беспокоит ордер, самым чистым, вероятно, будет использование пары циклов:

result = new List<int>(8);
for (dx = -1; dx <= 1; ++dx) {
    for (dy = -1; dy <= 1; ++dy) {
        if (dx != 0 || dy != 0) {
            result.Add(array[x + dx][y + dy]);
        }
    }
}

Если ордер важен, вы можете построить список всех (dx, dy) в нужном вам порядке и вместо этого выполнить итерацию.

Как указано в комментариях, вы, вероятно, захотите добавить проверку границ. Вы можете сделать это следующим образом (предполагая, что порядок не имеет значения):

List<int> result = new List<int>(8);
for (int dx = (x > 0 ? -1 : 0); dx <= (x < max_x ? 1 : 0); ++dx)
{
    for (int dy = (y > 0 ? -1 : 0); dy <= (y < max_y ? 1 : 0); ++dy)
    {
        if (dx != 0 || dy != 0)
        {
            result.Add(array[x + dx][y + dy]);
        }
    }
}
23
ответ дан 29 November 2019 в 20:21
поделиться

Я недавно написал плагин jQuery, чтобы получить позицию: фиксированные работающие в IE 6+. Это не Jitter On Scroll, он смотрит на возможности (не пользователь-агент), работает в Internet Explorer 6, 7, 8.

Если вы используете строгий режим в IE7 + положение: фиксировано будет Почитаемый, но по умолчанию IE7 + работает в режиме quirks. Этот плагин проверяет возможности для браузера, и если это не почетное положение: исправлено, то это реализует Fix jQuery.

http://code.google.com/p/fixedPosition/

Что-то вроде этого может работать для вас:

$(document).ready(function(){
   $("#chatForm").fixedPosition({
      debug: true,
      fixedTo: "bottom"
   });
});

Вам может потребоваться внесение небольших корректировок CSS, чтобы она работала для вашего кода. Я работаю над ценностями «компенсировать» как варианты, как мы говорим.

-121--3787741- [11887741-

Я, вероятно, пошел на постоянный список DX, DY для каждого направления, например:

struct {
    int dx;
    int dy;
} directions[] = {{-1,-1,},{-1,0,},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

, то вы бывали по поводу указаний, используя простую петлю:

for (int i = 0; i < 8; i++) {
    // use x + directions[i].dx;
    // use y + directions[i].dy;
}

Вы Может, конечно, использовать SizeOf (направления) / SizeOf (направления [1]) вместо 8 выше.

12
ответ дан 29 November 2019 в 20:21
поделиться

В C++ это может выглядеть так:

vector<int> adj;
for (int i = 0; i < 9; i++)
  if (i != 4) adj.push_back(array[x + i/3 - 1][y + i%3 - 1]);

Это не очень ясное решение, но очень короткое.

2
ответ дан 29 November 2019 в 20:21
поделиться

лично, петли более уродливы, чем оригинальные.

topLeft  = array[ x - 1 ][ y - 1 ]
top      = array[ x     ][ y - 1 ]
topRight = array[ x + 1 ][ y - 1 ]

midLeft  = array[ x - 1 ][ y     ]
midRight = array[ x + 1 ][ y     ]

botLeft  = array[ x - 1 ][ y + 1 ]
bot      = array[ x     ][ y + 1 ]
botRight = array[ x + 1 ][ y + 1 ]

Но без указания, зачем нужны значения - то, что вы делаете в разных направлениях, подразумевает, хотите ли вы, чтобы значения были в отдельных переменных или нет.

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

Другой способ работы с границами - расширить массив на одну ячейку в каждом направлении. Это позволяет избежать дорогостоящих ветвей в коде сверток.

7
ответ дан 29 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: