¿Qué hay de nodos y punteros?
Suponiendo que siempre haya 6 caras y que 1 nodo represente 1 cuadrado en 1 cara:
r , g , b
r , g , b
r , g , b
| | |
r , g , b - r , g , b
r , g , b - r , g , b
r , g , b - r , g , b
Un nodo tiene un puntero a cada nodo al lado. Una rotación circular solo migra el puntero (Número de nodos / Número de caras) -1 nodos, en este caso 2. Dado que todas las rotaciones son rotaciones circulares, simplemente construye una rotate
función. Es recursivo, mueve cada nodo un espacio y comprueba si los ha movido lo suficiente, ya que habrá recogido el número de nodos, y siempre hay cuatro caras. De lo contrario, incremente el número de veces que se movió el valor y la llamada rotará nuevamente.
No olvide que está doblemente vinculado, así que actualice también los nodos recién apuntados. Siempre habrá Altura * Ancho número de nodos movidos, con un puntero actualizado por nodo, por lo que debería haber Altura * Ancho * 2 número de punteros actualizados.
Dado que todos los nodos se apuntan entre sí, simplemente camine en círculo actualizando cada nodo a medida que se acerca.
Esto debería funcionar para cualquier tamaño de cubo, sin casos extremos o lógica compleja. Es solo una caminata / actualización de puntero.