Поскольку тривиальный способ будет заполнять всю матрицу 1, я предполагаю, что вы хотите, чтобы минимальное число 0 было повернуто на 1.
Вот такой подход, который вы можете использовать:
- Найти все компоненты 1-й в матрице. (Дайте идентификатор им, позвоните им в виде A, B, C)
- Создайте копию матрицы.
- Выберите A. Сделайте BFS из всех «outpoints» A (в окружении, по меньшей мере, одного
0
) другим подключенным компонентам (B, C). (BFS для кратчайших путей, конечно)
- Теперь в исходной матрице отметьте эти точки (скажем) 2.
- Повторите выше 2 шагов с B и C, а также. Вы можете заполнить исходную матрицу различными идентификаторами пути, если хотите. (3 для B, 4 для C и т. Д.)
Теперь рассмотрим связанные 1 как узлы и 2, 3 и т. Д. В графе как ребра. Вес края будет (очевидно) числом 2, 3 и т. Д. С одного узла на другой. Теперь вы можете сформировать MST этого графика, используя Prims или Kruskals algo.
Для матрицы (n * n) с k
связанными компонентами 1, этот алгоритм принимает сложность O (k * n * n) + O (k * k).
Что вы подразумеваете под связью? Я точно не понимаю ваш вопрос. – vish4071
И что вы подразумеваете под «не диагонально» ?? Если я рассматриваю ваш пример как матрицу 7x7, '1' в' (2,2) 'и' 1' в '(3,1)' расположены по диагонали. Не так ли? – vish4071
Нужно ли размещать каждый 0 рядом с другим 0? – SpiderPig