¿Qué hay de los nodos y los punteros?
Suponiendo que siempre hay 6 caras, y que 1 nodo representa 1 casilla 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 junto a él. Una rotación de círculo simplemente migra el puntero (Número de nodos / Número de caras) -1 nodos sobre, en este caso 2. Dado que todas las rotaciones son rotaciones de círculo, solo se genera una función rotate
. Es recursivo, moviendo cada nodo un espacio y verificando si los ha movido lo suficiente, ya que habrá recolectado 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 vuelva a llamar a rotar.
No olvide que está doblemente vinculado, así que actualice también los nodos recién apuntados. Siempre habrá Altura * Ancho de los 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 por el círculo actualizando cada nodo a medida que se acerca.
Esto debería funcionar para cualquier cubo de tamaño, sin casos de borde o lógica compleja. Es solo un puntero a pie / actualización.