До сих пор мне удавалось написать алгоритм, вращающий матрицу 3 раза и отслеживающий узлы с фиксированными индексами. То же самое можно написать для любого типа графика, используя визуальные координаты узла вместо индексов.
fun rotateMatrix(matrix: List<IntArray>): List<IntArray> {/*---*/}
val reflections = mutableListOf<Pair<Number, Number>>()
(0..2).fold(mat) { a, b ->
val new = rotateMatrix(a)
mat.forEachIndexed { x, e ->
e.forEachIndexed { y, e2 ->
reflections.add(mat[x][y] to new[x][y])
}
}
new
}
Результатом является отношение, описывающее, что (0,2,8,6) являются «одинаковыми»; (1,5,3,7) и т. Д. Единственное, что осталось сделать, - это использовать выходные данные, чтобы определить, каким парам узлов соответствуют какие отражающие братья и сестры.