Visualización de algoritmos
- Dirección del almacén de código en la nube: https://gitee.com/CandyWall/alogrithm-visualizer
, amigos a los que les guste, recuerden pedir una estrella
- Este código hace referencia
liuyubobobo
a un curso "7 Aplicaciones clásicas que interpretan la esencia de los algoritmos de Java" de un profesor de Mukenet, y ha realizado ciertas mejoras y personalizaciones personales basadas en el código de referencia del curso.
- Principalmente en el lenguaje Java, a través de 7 divertidos juegos clásicos, el algoritmo se usa realmente en el desarrollo real.
Lenguaje y tecnología utilizados para la visualización.
Swing de Java
Contenido visual
1. Algoritmo de simulación de probabilidad
Utilice el algoritmo de Monte Carlo para simular y calcular PI
2. Algoritmo de clasificación
Visualización de clasificación de selección
Visualización de ordenación por inserción
Visualización de clasificación de combinación
3. El laberinto resuelve automáticamente el laberinto.
-
Nota: El juego de resolución automática de laberintos agrega un evento de clic del teclado. Al presionar el botón del teclado correspondiente, se activará la operación correspondiente.
- Presione el número 1: algoritmo de recorrido de profundidad primero para generar laberinto
- Presione el número 2: algoritmo no recursivo de recorrido en profundidad primero para generar un laberinto
- Por el número 3: el algoritmo de recorrido transversal primero genera un laberinto
- Presione el número 4: algoritmo de recorrido de cola aleatorio para generar laberinto
- Presione el número 5: algoritmo de cola aleatorio mejorado para generar laberinto
- Presione el número 7: algoritmo recursivo transversal de profundidad primero para resolver el laberinto
- Presione el número 8: algoritmo no recursivo de recorrido en profundidad primero para resolver el laberinto
- Presione el número 9: Algoritmo de recorrido de ancho primero para resolver el laberinto
- Presiona el número 0: limpia la pantalla y el juego vuelve al estado brumoso
-
Lea la información del laberinto del archivo y visualícela;
Método de escritura recursiva transversal en profundidad primero + método de retroceso para resolver la visualización del laberinto;
Método de escritura no recursiva transversal en profundidad para resolver la visualización del laberinto;
Algoritmo transversal de amplitud primero para resolver la visualización del laberinto;
4. Genera un laberinto
- En aras de la simplicidad, en el laberinto de M filas y N columnas, primero estipule que la entrada del laberinto es (1, 0) y la salida es (M-2, N-1)
Preparación antes de que se genere el laberinto
El siguiente es un laberinto de 61 x 91. La intersección de filas impares y columnas impares es un pasaje (sin muro). Necesitas generar un mapa como este antes de generar el laberinto. Entonces solo necesita atravesar todas las carreteras que se cruzan en filas impares y columnas impares en profundidad primero, y luego romper la pared antes de las dos carreteras para producir un laberinto.
El algoritmo recursivo transversal de profundidad primero genera un laberinto
Algoritmo no recursivo transversal de profundidad primero para generar un laberinto
Algoritmo no recursivo transversal primero en amplitud para generar un laberinto
Cree una cola aleatoria para que el proceso de generación de laberintos sea más aleatorio
Agregue niebla a la parte no generada para hacer que el proceso de generar el laberinto sea más ornamental y misterioso.
Consulte el código de cola aleatorioRandomQueue.java
El proceso de generación del laberinto aleatorio se muestra en la siguiente figura:
El proceso de solución del laberinto aleatorio se muestra en la siguiente figura:
Mejora la aleatoriedad del laberinto generado.
Después de muchas veces de generación de laberintos y proceso de solución, la tendencia general de la ruta de solución de laberintos es una curva no muy tortuosa de arriba a la izquierda a abajo a la derecha, y la aleatoriedad no es lo suficientemente fuerte, por lo que el código de los elementos de acceso aleatorio de la cola aleatoria está optimizado. Consulte EnhancedRandomQueue.java
El proceso de generación del laberinto después de aumentar la aleatoriedad se muestra en la siguiente figura:
El proceso de resolución del laberinto después de aumentar la aleatoriedad se muestra en la siguiente figura:
5. Buscaminas
Victoria del juego Buscaminas y fin del juego
juego terminado
Nota: ¡Una vez finalizado el juego, puedes presionar Enter para reiniciar el juego!
victoria
30 minas al azar en el tablero de juego
Evaluación de algoritmos aleatorios
-
Objetivo del algoritmo: colocar aleatoriamente un número específico de minas en el mismo número de cuadrículas en el área de juego
-
Utilice una gran cantidad de veces para contar los tres algoritmos de codificación aleatoria, consulte
RandomAlgorithmAssessment.java
-
arr: la matriz que se planificará aleatoriamente; mineNumber: el número de minas (menor que la longitud de la matriz)
-
Algoritmo aleatorio 1: intercambie el valor de cada cuadrícula con el valor de la cuadrícula aleatoria
for (int i = 0; i < arr.length; i++) { int j = (int) (Math.random() * arr.length); swap(arr, i, j); }
-
Algoritmo aleatorio 2: intercambie el valor en la cuadrícula donde se encuentra cada mina con el valor en la cuadrícula aleatoria
for (int i = 0; i < mineNumber; i++) { int j = (int) (Math.random() * arr.length); swap(arr, i, j); }
-
Algoritmo de Knuth: obtener elementos aleatoriamente del intervalo [i, n) e intercambiarlos con el elemento i-ésimo
for (int i = 0; i < arr.length; i++) { int j = (int) (Math.random() * (arr.length - i) + i); swap(arr, i, j); }
-
Otra forma de escribir el algoritmo de Knuth es obtener elementos aleatoriamente del intervalo [0, i + 1) y luego intercambiarlos con el elemento i-ésimo
for (int i = arr.length - 1; i >= 0; i--) { int j = (int) (Math.random() * (i + 1)); swap(arr, i, j); }
-
Para cada algoritmo en el caso de N = 10000000, n = 10, m = 5 (N es el número de estadísticas, n es la longitud de la matriz, m es la cantidad de truenos en la matriz), la frecuencia de los truenos que aparecen en cada posición de la matriz es la siguiente Como se muestra en la figura:
-
6. El juego de la caja en movimiento da pasos para la solución.
introducción del juego:
Este es un juego de Sokoban similar de Match-3, que es diferente del Sokoban tradicional. Este Sokoban requiere que muevas la caja dentro de un número específico de pasos, de modo que tres cajas idénticas en el panel del juego se puedan conectar en una fila o en una fila, que puede ser eliminada. Condiciones, además, el juego está equipado con un sistema de gravedad. Si la caja alta se mueve hacia la izquierda o hacia la derecha o si la caja de abajo es eliminada, hará que la caja caiga hacia abajo. , detectará si hay un nuevo borrable continuo Las tres cajas conectadas, la cubierta del juego es la siguiente
Este es un cierto nivel en el juego: se requiere eliminar todas las casillas con la condición de mover un paso.
Simbolización de los objetos del juego
Ahora convierta la distribución de los cuadros en el nivel superior en una matriz de caracteres bidimensionales y guárdelo en el archivo junto con el número de operaciones.
1
.....
..A..
..B..
..A..
..B..
.BAB.
.BAB.
.ABA.
Luego use el código para leer el número de pasos de operación y la matriz de caracteres bidimensionales Para alinear los caracteres en cada columna, las posiciones vacías se indican con puntos y los diferentes tipos de casillas se indican con letras diferentes.
Renderizar objetos simbólicos del juego
Después de leer el código, se representa en la página como se muestra en la figura siguiente.Como no hay material de caja del juego original, encontré algunas imágenes en Internet para reemplazarlo.
Ver los pasos de la solución
Para que la solución sea más intuitiva, se escribe una coordenada en el medio de cada cuadro, que representa la fila y la columna donde se encuentra actualmente el cuadro.
Según los resultados impresos por la consola y las coordenadas en el mapa, dirígete al juego para realizar las operaciones correspondientes para pasar este nivel.
交换 (3, 2) 和 (4, 2)
游戏有解!
7. Dibuja un gráfico fractal
Dibujar círculos concéntricos de forma recursiva
Dibujar recursivamente un gráfico fractal vicsek (rectangular)
Puede presionar 0 a 6 en el teclado para realizar fractales con diferentes tiempos de recursividad
Inicialice el número predeterminado de recursividad a 0, mostrando que toda el área es un color
Presione el teclado 1-6 respectivamente para dibujar el siguiente gráfico fractal