Programa para resolver el cubo de rubik

Programa para resolver el cubo de rubik en línea

asolver – show me the puzzle…

Este documento de la ACM describe varias formas alternativas que ha utilizado para representar un cubo de rubik y las compara entre sí. Lamentablemente, no tengo una cuenta para obtener el texto completo, pero la descripción dice

Se presentan y comparan siete representaciones alternativas del cubo de Rubik: una matriz de 3 por 3 por 3 de enteros de 3 dígitos; una matriz de 6 por 3 por 3 de literales; una matriz de 5 por 12 literales; una matriz de literales dispersos de ll por ll; un vector de 54 elementos; una matriz de 4 dimensiones; y una matriz anidada de 3 por 3 por 3. Se dan funciones APL para los movimientos de orientación y los cuartos de vuelta, además de varias herramientas útiles para resolver el cubo.

La respuesta corta es que depende de cómo vayas a resolver el cubo. Si su solucionador va a utilizar un método humano como el enfoque por capas o el método Fridrich entonces la estructura de datos subyacente no hará mucha diferencia. Un ordenador puede resolver un cubo utilizando un método humano en un tiempo insignificante (bastante menos de un segundo) incluso en el más lento de los lenguajes de programación. Pero si va a resolver el cubo utilizando un método más intensivo desde el punto de vista computacional, como el algoritmo de 52 movimientos de Thistlethwaite, el algoritmo de 29 movimientos de Reid o el algoritmo de 20 movimientos de Korf, entonces la estructura de datos y el lenguaje de programación son de suma importancia.

robot solucionador del cubo de rubik

En la universidad, los temas de programación en C que hemos tratado (o trataremos) no pasan de arrays dinámicos. Podemos utilizar estructuras, funciones, arrays, punteros pero no clases porque esto es C, no C++.

¿Es este el enfoque correcto? ¿Cómo crees que debo girar una línea? Una vez más, no es necesario el código, si usted puede explicar la lógica principal y cómo debo romper el código o incluso Pseudo-código, que sería grande.

Cualquiera de las dos opciones que has descrito hará el trabajo. La forma de dividirlo con la lógica depende realmente de lo que tenga más sentido para ti. Lo que podría ayudar es escribir una lista de las características de un cubo de rubix y reorganizarlas hasta que tengas una forma de representar cada parte del objeto. Tu idea de la matriz es un magnífico comienzo para esto.

Para completar, aunque no se pregunte, la forma más fácil de resolver el puzzle es probar por fuerza bruta todas las secuencias posibles de movimientos hasta encontrar una solución. Pero eso resultaría en un uso muy ineficiente de la memoria y el procesador. Como la solución se suele encontrar en 20 movimientos, en el peor de los casos habría que probar alrededor de 1,0E14 movimientos…

solucionador de cubos 3×3

Quería escribir un programa en c++ para resolver un cubo de rubik de 3×3, pero fracasé en el intento. Así que cogí un cubo de rubik de 2×2 y escribí un programa usando el algoritmo Blindfold cubing. ¿Puede alguien ayudarme a escribir un programa más eficiente?

Ahora mismo, el objeto Solver simplemente contiene dos docenas de cadenas estáticas. No tiene inteligencia y no sabe, en ningún sentido, nada sobre el cubo que pretende resolver. Un solucionador mejor podría mantener un modelo del cubo revuelto para seguir su estado.

“El verdadero problema es que los programadores han pasado demasiado tiempo preocupándose por la eficiencia en los lugares y momentos equivocados; la optimización prematura es la raíz de todos los males (o al menos de la mayoría) en la programación.”

Tu programa en particular probablemente pasa el 99% de su tiempo haciendo E/S, por lo que las diferencias de rendimiento entre las posibles alternativas es probablemente la mejor aproximación a cero. Si lo que realmente buscas es un algoritmo mejor, entonces ese es un problema diferente.

El uso de std::endl emite un n y vacía el flujo. A menos que realmente necesites que el flujo se vacíe, puedes mejorar potencialmente el rendimiento del código simplemente emitiendo ‘n’ en lugar de usar el potencialmente más costoso computacionalmente std::endl.

Santiago Paez