Visualização de algoritmo
- Endereço do armazém da nuvem de código: https://gitee.com/CandyWall/alogrithm-visualizer
, amigos que gostam, lembre-se de pedir uma estrela
- Este código se refere
liuyubobobo
a um curso "7 aplicativos clássicos interpretando a essência dos algoritmos Java" por um professor da Mukenet e fez algumas melhorias e personalizações pessoais com base no código de referência do curso.
- Principalmente na linguagem Java, por meio de 7 jogos divertidos clássicos, o algoritmo é realmente utilizado no desenvolvimento real.
Linguagem e tecnologia usada para visualização
Java Swing
Conteúdo visual
1. Algoritmo de simulação de probabilidade
Use o algoritmo de Monte Carlo para simular e calcular PI
2. Algoritmo de classificação
Visualização de classificação de seleção
Visualização de classificação por inserção
Visualização da classificação por mesclagem ![](https://img-blog.csdnimg.cn/img_convert/26fccee4712a743b535091a0c05927b4.gif)
3. O labirinto resolve automaticamente o labirinto
-
Observação: o jogo de solução automática de labirinto adiciona um evento de clique do teclado. Pressionar o botão correspondente do teclado acionará a operação correspondente
- Pressione o número 1: algoritmo de passagem de profundidade para gerar labirinto
- Pressione o número 2: algoritmo de passagem de profundidade não recursivo para gerar um labirinto
- Pelo número 3: algoritmo de passagem em amplitude gera labirinto
- Pressione o número 4: algoritmo de passagem de fila aleatório para gerar labirinto
- Pressione o número 5: algoritmo de fila aleatório aprimorado para gerar labirinto
- Pressione o número 7: algoritmo recursivo de passagem em profundidade para resolver o labirinto
- Pressione o número 8: algoritmo transversal não recursivo de profundidade para resolver o labirinto
- Pressione o número 9: algoritmo de passagem em largura para resolver o labirinto
- Pressione o número 0: limpe a tela e o jogo retorna ao estado nebuloso
-
Leia as informações do labirinto do arquivo e visualize-as;
Método de escrita recursiva de passagem em profundidade + método de retrocesso para resolver a visualização do labirinto;
Método de escrita não recursiva de passagem de profundidade para resolver a visualização do labirinto;
Algoritmo de passagem em largura para resolver a visualização do labirinto; ![](https://img-blog.csdnimg.cn/img_convert/d1906f42618185ad164de9eda6c5f041.gif)
4. Gere um labirinto
- Para simplificar, no labirinto de M linhas e N colunas, estipule primeiro que a entrada do labirinto é (1, 0) e a saída é (M-2, N-1)
Preparação antes que o labirinto seja gerado
O que se segue é um labirinto de 61 x 91. A intersecção de linhas ímpares e colunas ímpares é uma passagem (sem parede). Você precisa gerar um mapa como este antes de gerar o labirinto. Em seguida, ele só precisa atravessar primeiro todas as estradas que se cruzam em linhas ímpares e colunas ímpares em profundidade e, em seguida, quebrar a parede antes das duas estradas para produzir um labirinto.
O algoritmo recursivo de passagem em profundidade gera um labirinto![](https://img-blog.csdnimg.cn/img_convert/06dcaf6e4a66196956ba32ab66034e13.gif)
Algoritmo de passagem de profundidade não recursivo para gerar um labirinto![](https://img-blog.csdnimg.cn/img_convert/e6c9eca0a41aab08c8393084c8dc9b61.gif)
Algoritmo transversal não recursivo para gerar um labirinto![](https://img-blog.csdnimg.cn/img_convert/9772b411a9c0ebd2231fbf8e7f0efc53.gif)
Crie uma fila aleatória para tornar o processo de geração do labirinto mais aleatório![](https://img-blog.csdnimg.cn/img_convert/8bee1cf847cdd6181e6b115a9671f384.gif)
Adicione névoa à parte não gerada para tornar o processo de geração do labirinto mais ornamental e misterioso
Por favor, consulte o código de fila aleatórioRandomQueue.java
O processo de geração do labirinto aleatório é mostrado na figura abaixo:
O processo de solução do labirinto aleatório é mostrado na figura abaixo:
Aumente a aleatoriedade do labirinto gerado
Depois de muitas vezes de geração de labirinto e processo de solução, a tendência geral do caminho de solução de labirinto é uma curva não muito tortuosa do canto superior esquerdo para o canto inferior direito, e a aleatoriedade não é forte o suficiente, então o código de elementos de acesso aleatório da fila aleatória é otimizado. Consulte EnhancedRandomQueue.java
O processo de geração do labirinto após aumentar a aleatoriedade é mostrado na figura a seguir:
O processo de resolução do labirinto após aumentar a aleatoriedade é mostrado na figura abaixo:
5. Campo Minado
Vitória e fim de jogo do Campo Minado
game Over
Nota: Depois que o jogo terminar, você pode pressionar Enter para reiniciá-lo!
vitória
30 minas aleatórias no tabuleiro de jogo
Avaliação de algoritmo aleatório
-
Objetivo do algoritmo: colocar aleatoriamente um número especificado de minas no mesmo número de grades na área de jogo
-
Use um grande número de vezes para contar os três algoritmos de embaralhamento aleatório, consulte
RandomAlgorithmAssessment.java
-
arr: a matriz a ser planejada aleatoriamente; mineNumber: o número de minas (menor que o comprimento da matriz)
-
Algoritmo Aleatório 1: Troque o valor em cada grade com o valor na grade aleatória
for (int i = 0; i < arr.length; i++) { int j = (int) (Math.random() * arr.length); swap(arr, i, j); }
-
Algoritmo Aleatório 2: Troque o valor na grade onde cada mina está localizada com o valor na grade aleatória
for (int i = 0; i < mineNumber; i++) { int j = (int) (Math.random() * arr.length); swap(arr, i, j); }
-
Algoritmo de Knuth: obter aleatoriamente os elementos do intervalo [i, n), e trocar com o i-ésimo elemento
for (int i = 0; i < arr.length; i++) { int j = (int) (Math.random() * (arr.length - i) + i); swap(arr, i, j); }
-
Outra maneira de escrever o algoritmo de knuth é obter elementos aleatoriamente do intervalo [0, i + 1) e, em seguida, trocá-los com o i-ésimo elemento
for (int i = arr.length - 1; i >= 0; i--) { int j = (int) (Math.random() * (i + 1)); swap(arr, i, j); }
-
Para cada algoritmo no caso de N = 10000000, n = 10, m = 5 (N é o número de estatísticas, n é o comprimento da matriz, m é o número de trovões na matriz), a frequência de aparecimento de trovões em cada posição na matriz é o seguinte, conforme mostrado na figura:
-
6. O jogo da caixa móvel fornece as etapas de solução
introdução do jogo:
Este é um jogo Sokoban de combinação de 3 semelhantes, que é diferente do Sokoban tradicional. Este Sokoban requer que você mova a caixa dentro de um determinado número de etapas, de modo que três caixas idênticas no painel do jogo possam ser conectadas em uma linha ou linha, que pode ser eliminada. Condições, além disso, o jogo está equipado com um sistema de gravidade. Se a caixa alta se mover para a esquerda ou direita ou a caixa abaixo dela for eliminada, fará com que a caixa caia. Depois de cair , ele irá detectar se há um novo apagável contínuo As três caixas conectadas, a capa do jogo é a seguinte
Este é um certo nível do jogo: é necessário eliminar todas as caixas sob a condição de mover um passo.
Simbolização de objetos do jogo
Agora converta a distribuição das caixas no nível acima em uma matriz de caracteres bidimensional e salve-o no arquivo junto com o número de operações.
1
.....
..A..
..B..
..A..
..B..
.BAB.
.BAB.
.ABA.
Em seguida, use o código para ler o número de etapas da operação e a matriz bidimensional de caracteres.Para alinhar os caracteres em cada coluna, as posições vazias são indicadas por pontos e diferentes tipos de caixas são indicados por letras diferentes.
Renderizar objetos de jogo simbólicos
Depois de ler o código, ele é renderizado na página conforme mostra a figura abaixo: Como não há caixa de material do jogo original, encontrei algumas fotos na Internet para substituí-lo.
Veja as etapas da solução
Para tornar a solução mais intuitiva, uma coordenada é escrita no meio de cada caixa, que representa a linha e coluna onde a caixa está localizada no momento.
De acordo com os resultados impressos pelo console e as coordenadas no mapa, vá para o jogo para realizar as operações correspondentes para passar de nível.
交换 (3, 2) 和 (4, 2)
游戏有解!
7. Desenhe um gráfico fractal
Desenhe círculos concêntricos recursivamente
Desenhar recursivamente o gráfico fractal vicsek (retangular)
Você pode pressionar de 0 a 6 no teclado para realizar fractais com tempos de recursão diferentes
Inicialize o número padrão de recursão para 0, mostrando que toda a área é uma cor
Pressione o teclado de 1 a 6 respectivamente para desenhar o seguinte gráfico fractal