algoritmo clássico (21) Graduados serão oito rainhas problema [algoritmo]

EDITORIAL : Eu sou uma "vela para o mar", o apelido vem do nome do nome da minha namorada também. tecnologia I amor, amor open source, programação amor. 技术是开源的、知识是共享的.

Este blog é um pouco resumo e gravar sua própria aprendizagem, se você tem o Java , algoritmos interessados, você pode se concentrar no meu dinâmico, aprendemos juntos.

用知识改变命运,让我们的家人过上更好的生活.

artigos relacionados

Clique aqui para algoritmo de vista [série] artigos do blog


1. Descrição do problema

八皇后问题, Uma problemas antigos e bem conhecidos, é um caso típico de retrocesso algoritmos. As questões levantadas pelo jogador internacional de xadrez Max Betel em 1848: 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上perguntou quantas método pêndulo. Gauss acho que existem 76 tipos de programas. 1854 em Berlim, na revista diferente de xadrez publicado 40 tipos de soluções diferentes, então alguém a resolver 92 tipos de resultados usando a teoria dos grafos. Após a invenção do computador, há uma variedade de linguagens de programação de computador pode resolver este problema.

Eu acredito que temos jogado 死亡八皇后游戏, aqui é o que eu jogar jogos online tela gravada.

Aqui Insert Picture Descrição

2, a análise do problema

Objetivo : colocar oito rainhas em uma xadrez 8 × 8 grade

Regras : Quaisquer duas damas não podem estar na mesma linha, coluna ou mesmo a mesma diagonal

Desde que a rainha não pode ser qualquer ponto, de modo que cada linha até colocar uma rainha;
já que o número de linhas igual ao número rainha, de modo que cada linha, pelo menos, uma rainha.

conclusão :每一行一定是放一个皇后

3, para alcançar a lógica

Aqui Insert Picture Descrição

① Em primeiro lugar, uma rainha na primeira linha 1 8 × 8 grade de coluna xadrez 1

② Em seguida, coloque a segunda rainha, tentando colocar a primeira coluna da segunda linha, e então determinar se a regra está satisfeito. Se não, continuar a tentar na segunda coluna, a terceira posição da coluna ... tentar colocar todas as colunas de todas acabado, encontrar uma colocação adequada.

③ continuar a colocar uma terceira rainha, e passo processo de colocação ② empatia.

... ...

④ assim por diante, colocar o quarto quinto, sexto, sétimo, oitavo Rainha,

⑤ Quando obter uma solução correta quando:

A oitava tentativa de mover a colocação da Rainha, para ver se não há nenhum outro lugar maneira,
tentar mover a colocação da sétima rainha ver se não há nenhum outro lugar maneira,
tentar mover a colocação do sexto Queens, olhar não há outra maneira de colocar;
... ...
e assim por diante, o quinto, quarto, terceiro, segunda posição para mover a rainha para ver se não há nenhuma outra maneira de colocar.
Esta foi a primeira rainha na primeira linha, primeira coluna todas as possibilidades

⑥ continua então de volta para a primeira coluna de uma segunda rainha colocado atrás do ciclo continua executar o passo acima ①, ②, ③, ④, ⑤

Para usar no processo 回溯算法de pensar, 从一条路往前走,能进则进,不能进则退回来,换一条路再试。oito rainhas retrocesso algoritmos problema típico é o primeiro passo para colocar uma rainha, então a segunda etapa em linha com as exigências colocar as duas primeiras rainhas, se não houver condições de cumprir os requisitos, então temos de mudar primeiro localização de uma rainha, ea posição das duas rainhas re-lançado, até encontrar a posição qualificada sobre ele.

De volta ao problema de pesquisa labirinto usando muito comum, essa estrada é um beco sem saída, em seguida, retornar para a interseção anterior e continuar no caminho.

使用一个一维数组表示皇后的位置,其中数组的下标表示皇后所在的行,也就是第几个皇后,数组元素的值表示皇后所在的列。

4, implementação de código

package com.study.algorithm;

/**
 * @Description:
 * @Author: 扬帆向海
 * @Date: Created in 01:26 2020/4/4
 */
public class EightQueens {

    static final int COUNT = 8;

    /**
     * 用一维数组存放皇后的摆放位置
     */
    static int[] array = new int[COUNT];
    /**
     * 用来记录有多少种摆放方案
     */
    static int sum = 0;

    public static void main(String[] args) {
        putQueen(0);
        System.out.println("八皇后总共有" + sum + "种摆放方案");
    }

    /**
     * 在棋盘上摆放皇后
     *
     * @param n 第几个皇后
     */
    public static void putQueen(int n) {
        // 如果n=COUNT,表示皇后放置完毕
        if (n == COUNT) {
            System.out.print((sum + 1) + "、八皇后的摆放位置是:");
            for (int i = 0; i < COUNT; i++) {
                int pos = array[i] + 1;
                System.out.print(pos + " ");
            }
            System.out.println();
            System.out.print("摆放位置如下图所示:");
            printPlace();
            return;
        } else {
            // 依次往棋盘中放入皇后
            for (int i = 0; i < COUNT; i++) {
                // 先把当前这个皇后n,放到该行的第一列
                array[n] = i;
                // 调用方法,判断把第n个皇后在第i列时,是否有冲突
                if (checkPlace(n)) {
                    // 不冲突,接着放置第(n+1)个皇后,即开始递归
                    putQueen(n + 1);
                }
            }
        }
    }

    /**
     * 绘制COUNT×COUNT棋盘,打印皇后的位置
     */
    public static void printPlace() {
        System.out.println();
        sum++;
        for (int i = 0; i < COUNT; i++) {
            System.out.print(" ");
            for (int j = 0; j < COUNT; j++) {
                System.out.print("---");
            }
            System.out.println();
            for (int k = 0; k < COUNT; k++) {
                if (k == array[i]) {
                    System.out.print("|" + "♛");
                } else {
                    System.out.print("| " + " ");
                }
            }
            System.out.println("|");
        }
        System.out.print(" ");
        for (int i = 0; i < COUNT; i++) {
            System.out.print("---");
        }
        System.out.println();
    }

    /**
     * 检查皇后的摆放位置是否有冲突
     *
     * @param n 表示第几个皇后
     * @return
     */
    public static boolean checkPlace(int n) {
        for (int i = 0; i < n; i++) {
            // 一维数组的值表示该行的列值,如果值相同,则表示在同一列
            // n-i表示两个皇后相差几行,array[n]-array[i]表示相差几列,如果相减的绝对值相等,则表示在对角线上
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
                return false;
            }
        }
        return true;
    }
}

resultados da execução de código :

总共有 92 种摆放方案,由于篇幅有些,在此只截取了两种方案。

Aqui Insert Picture Descrição

Aqui Insert Picture Descrição


Como limitado, o blog será inevitavelmente alguns erros, não há vazamento de pesos pesados ​​descuidado asa em te imploro!

Publicado 101 artigos originais · ganhou elogios 4287 · Vistas 790.000 +

Acho que você gosta

Origin blog.csdn.net/weixin_43570367/article/details/104495769
Recomendado
Clasificación