Меня интересует алгоритм, который решает следующее (эффективно): двумерную матрицу чисел [1..9], которую необходимо выровнять по горизонтальным линиям сверху (1) к низу (9), но только путем переворачивания вертикально или горизонтально с другим номером.
Пример входной матрицы:
</p>
<pre><code>1 8 2 6 1 6
9 2 5 1 6 2
3 6 9 2 9 8
5 1 7 4 2 8
4 2 7 6 9 5
Матрица желаемого выхода:
</p>
<pre><code>1 1 1 1 2 2
2 2 2 2 3 4
4 5 5 5 6 6
6 6 6 7 7 8
8 8 9 9 9 9
Разъяснение по 'Flipping': возьмем, например, матрицу ввода. В верхнем левом углу есть «1». Эта 1 может либо перевернуться горизонтально с 8 рядом с ней (первая строка становится теперь 8 1 2 6 1 6
), либо вертикально с 9 под ней (первая колонка становится теперь 9 1 3 5 4
). Он не может перевернуться с 2 по диагонали.
Какие-нибудь решения (любой язык в порядке) этой проблемы?