Utilice Java Swing para darse cuenta de la esencia de 7 algoritmos clásicos de interpretación de aplicaciones

Visualización de algoritmos

  • Este código hace referencia liuyuboboboa 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.

imagen-20210326235007632

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!

imagen-20210328180303684

victoria

imagen-20210328212853457

30 minas al azar en el tablero de juego

imagen-20210328141001452

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, consulteRandomAlgorithmAssessment.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:

      imagen-20210328160137277

      imagen-20210328155957042

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

imagen-20210329180005073

Este es un cierto nivel en el juego: se requiere eliminar todas las casillas con la condición de mover un paso.

imagen-20210329180302902

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.

imagen-20210329182751415

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.

imagen-20210329181210898

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

imagen-20210329193958960

Inserte la descripción de la imagen aquí

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

Dibujar recursivamente un gráfico fractal SierpinskiCarpet (rectangular)

Dibujar recursivamente el gráfico fractal de SierpinskiTriangle (triángulo)

Dibujar recursivamente el gráfico fractal KochSnowflake (copo de nieve)

Dibujar recursivamente un gráfico fractal de árbol binario

Supongo que te gusta

Origin blog.csdn.net/qq_38505969/article/details/115322169
Recomendado
Clasificación