Algoritmo de retrocesso - problema de n rainhas

Qual é o algoritmo de retrocesso?
O método de retrocesso geralmente pode resolver os seguintes problemas:
      Problemas de combinação, problemas de permutação, problemas de subconjuntos, problemas de tabuleiro de xadrez e outros problemas ;
O problema da n-rainha é um dos problemas do tabuleiro de xadrez ;
Os problemas a serem resolvidos pelo método de retrocesso podem ser abstraídos em uma estrutura em árvore, que pode ser entendida como uma árvore N-ária;
O método de retrocesso usa recursão para encontrar recursivamente subconjuntos em um conjunto.O tamanho do conjunto pode ser entendido como a camada que requer recursão;
E ao usar recursão, deve haver uma condição de término , caso contrário não será possível sair do corpo da função e ocorrerá um erro. Portanto esta árvore N-ária é limitada;
O processo de algoritmo de retrocesso:
 
         1. Rastreie os parâmetros inseridos pela função e o valor de retorno; é um corpo de função

         2. Condição de rescisão; por ser recursivo, deve haver uma condição de rescisão

         3. Algoritmo de retrocesso central

                 Árvore N-ária: (

                     for loop: travessia horizontal

                      Recursão: travessia vertical

                )

         4. Valor de retorno de saída

Esta é a introdução central ao algoritmo de retrocesso

Vamos começar a procurar perguntas para começar! ! !

Se isso te ajudar, por favor, me dê um joinha! ! !    



Requisitos de perguntas

     Coloque n rainhas em um tabuleiro de xadrez n*n de modo que elas não possam atacar umas às outras. Ou seja, duas rainhas não podem estar na mesma linha, coluna ou diagonal. Quantas maneiras existem de colocá-las?

     Formato de entrada: 8

     Formato de saída: 92

Análise de perguntas

1. Para o tabuleiro de xadrez da rainha, existem estas regras

      1. Não pode estar na mesma linha

      2. Não pode estar na mesma coluna

      3. Não pode estar na mesma barra

Normalmente, para um tabuleiro de xadrez, usaremos um array bidimensional

Mas para esta regra do jogo, podemos saber que usar uma matriz unidimensional é bom, porque apenas uma peça de xadrez pode ser colocada em cada linha

2. Para essas três regras, nossa camada central deve ter dois julgamentos ( use matrizes unidimensionais, sem necessidade de considerar problemas de linha ) .

      Ao se preparar para colocar uma rainha na coluna atual, você precisa determinar:   

1. A posição atual da rainha está na mesma coluna      da rainha que foi colocada antes ? Em caso afirmativo, altere a coluna até a enésima coluna ( atingir o limite ). Você precisa voltar para a linha anterior de rainhas e alterar a posição da rainha. coluna da linha anterior de rainhas.

2. A posição atual da rainha está na mesma inclinação      da rainha colocada anteriormente ( ou seja, 45° ou 135° )? Em caso afirmativo, mude a coluna até a enésima coluna ( atingir o limite ) e você precisará voltar para a posição anterior linha de rainhas. , altera a coluna da rainha da linha anterior.

3. Condições de rescisão no processo recursivo

     Podemos pensar no algoritmo de retrocesso, a explicação mais direta é que a estrada atual está bloqueada, o que fazer, voltar, voltar à posição anterior e mudar de direção;

      A condição de término não é que você tenha voltado ao primeiro degrau e alcançado a última posição do primeiro degrau? Se não houver outra escolha, então acabou. Por que continuar ficando quando não há como ir? Hahahaha ;

   

Código



#include<bits/stdc++.h> 

using namespace std;


int main(){
         int  n,sum=0;
         cin>>n;	
         int HANG= 0;//皇后个数,行数;	
         int LIE = 0;//皇后占据的列为;
         int queen[n] = {0};//储存皇后的位置,值为列;						
		
	  while(1){
		
        int AK = 0;		//攻击
		if(HANG== 1 && queen[0] == 7 && LIE == 7)break;//终止条件	
		  
		//判断是否在同一列,统一斜线
		for(int i=0;i<HANG;i++)
		{			
			if(queen[i] == LIE)AK = 1;	//同一列,攻击	
			if(HANG-i == queen[i]-LIE ||HANG-i == -(queen[i]-LIE) )AK = 1;//同一斜线,攻击					
		}
		  
		//判断可不可以放入
		if(AK == 0)
		{	//表示可以放置
			queen[HANG] = LIE;		
			HANG++;	LIE = 0;				
			if(HANG== 8)sum++;				    
		 }
	    else
		{			
			 LIE++;			
			 while(LIE>=8)
			 {	//回朔,上一个皇后往后移一格
			     HANG--;				
				 LIE = queen[HANG]+1;	
			 }
		}
   }
	cout<<sum<<endl;
	return 0;	
}

A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !

A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !

A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !

Acho que você gosta

Origin blog.csdn.net/weixin_59367964/article/details/127986711
Recomendado
Clasificación