Алгоритм для сопоставления формы змеи Рубика

#java #al&orithm #rotation

#java #алгоритм #вращение

Вопрос:

Я пытаюсь реализовать симуляцию змеи Рубика, если у меня есть модель, сформированная из блока strin& 000000020000200000020000 24, каждый символ которого означает угол поворота для противоположного блока, если блок вращается, он вращает все блоки рядом с ним.

 if 0 = no rotation
1 = 90
2 = 180
3 = 270
  

как проверить, формируется ли одна и та же фигура разными шагами 200002000000020000200000

Я реализую на Java.

Комментарии:

1. Что вы уже пробовали?

2. @bkis Я пытался в линейной алгебре сопоставить центральные точки для каждого блока, но это было неточно или, возможно, моя реализация была неправильной

Ответ №1:

Назовите snake1 и snake2 вашими двумя змеями.

Представьте, что snake1 и snake2 образуют одну и ту же фигуру. Подумайте о первом блоке snake1. Этот блок должен совпадать с одним из блоков из snake2, чтобы две фигуры совпали. С каким блоком snake2 выравнивается первый блок snake1?

Этот вопрос дает начало алгоритму. Если первый блок snake1 синий, то перебирайте все синие блоки snake2 один за другим и предположим, что первый блок snake1 совпадает с этим блоком snake2. Существует две ориентации, в которых может находиться первый блок snake1 по сравнению с этим блоком snake2; вам придется перебирать эти две возможные ориентации.

После того, как вы выбрали блок snake2 и ориентацию, вызовите (0,0,0) позицию первого блока snake1 в пространстве и выполните цикл по всем блокам snake1 и сохраните их положение, записав blue или black в массив, представляющий все возможные позиции в трехмерном пространстве. Помечены все ячейки массива, которые не содержат блока empty .

Проделайте то же самое во втором массиве для блоков snake2.

Две змеи представляют одну и ту же форму тогда и только тогда, когда два массива представляют одну и ту же форму.

PS: Поскольку блоки являются призмами, а не кубами, если ячейка в массиве представляет собой куб, то вам нужно быть немного более явным, чем просто blue / black / empty в описании того, что содержит ячейка. Итак, вам нужно либо:

  • найдите более умный способ представления пространства, чем простой 3D-массив; или
  • найдите подходящие описания возможного содержимого ячейки (что-то вроде «наполовину черное, наполовину синее, в какой ориентации»).