Que tal nós e ponteiros?
Supondo que sempre haja 6 faces e que 1 nó represente 1 quadrado em 1 face:
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
Um nó tem um ponteiro para cada nó ao lado dele. Uma rotação de círculo apenas migra o ponteiro (Número de nós / Número de faces) -1 nós ao longo, neste caso 2. Como todas as rotações são rotações de círculo, você apenas constrói uma função rotate
. Ele é recursivo, movendo um espaço para cada nó e verificando se ele foi movido o suficiente, já que ele terá coletado o número de nós e sempre haverá quatro faces. Caso contrário, incremente o número de vezes que o valor foi movido e chame novamente para girar.
Não se esqueça de que está duplamente ligado, por isso atualize também os nós recém-apontados. Sempre haverá Height * Número de largura dos nós movidos, com um ponteiro atualizado por nó, portanto, deve haver Height * Width * 2 número de ponteiros atualizados.
Como todos os nós apontam um para o outro, basta percorrer um círculo atualizando cada nó à medida que você chega a ele.
Isso deve funcionar para qualquer cubo dimensionado, sem casos de borda ou lógica complexa. É apenas um ponteiro de caminhada / atualização.