при условии, что расстояние должно быть прямым путем между двумя одинаковыми числами (т.е. без перекрестков с круговым движением или бесконечных петель).
- создать массив из 10 (для цифры, которая появляется в проблеме)
- создать массив для каждой цифры для каждой позиции этой цифры. то есть образец всей сетки и упорядочить ее по номеру.
DIGIT_STRUCT[n].POSTITIONS[]
- выбрать комбо из тех позиций, которые являются максимальным расстоянием
- это сложная часть. но так как диагональные ходы разрешены, а таблица квадратная, я считаю, что вы можете ранжировать каждое сообщение по его расстоянию от начала координат (0,0). вам просто нужно выбрать первый и последний случай (по рангу). своего рода, для каждого списка цифр
DIGIT_STRUCT[n].MAX_DIST {POSITION a, POSITION b}
- убедитесь, что хотя бы один минимальный путь для каждого
MAX_DIST
существует, не нажимая другой номер позиции. путь будет заблокирован только в том случае, если эта строка будет заполнена целой строкой или столбцом. в вашем 6
примере весь столбец заблокирован в подсетке другим 6.
- сравнить каждую цифру максимального расстояния.
здесь не нужно выполнять всю работу, вам не нужно проверять пути, которые, очевидно, будут короче. если путь признан недействительным, вам не нужно искать другую позицию (сразу), если другая цифра содержит такой же путь.
если вы найдете потенциальный путь размера сетки (16 в вашем примере), вам следует просто попробовать и проверить его, так как другие не будут длиннее.
проверка пути должна потребовать двух массивов размера подсетки, hor и vert, добавить число к каждому vert [x] и hor [y] для каждого POSTITION (x, y) в DIGIT_STRUCT, который находится внутри подсетки. если не существует vert [n] или hor [m], равного размеру подсетки, вы знаете, что кратчайший путь там не будет заблокирован.
EDIT
забыл, что путь может быть неоптимальным. если существует такая ситуация, как
0 0 1 1
1 0 1 1
1 0 0 0
1 1 1 0
здесь ответ будет 0, путь = 6, от (0, 0) до (3, 3)
в этом случае вам придется проверять путь для каждого числа, и эта проверка должна возвращать расстояние. потому что расстояние пути может увеличиться, вам придется проверять намного больше путей для каждого числа (расстояние может быть не больше, чем в два раза).
Q. Вы вынуждены идти по самому прямому пути? в этом случае (квадратная подрешетка) существует только один прямой путь и он заблокирован. если вы вынуждены делать это, то я думаю, что вы можете получить некоторую производительность обратно, зная, что путь не увеличится во время проверки.