Algoritmo de retroceso: problema de n reinas

¿Qué es el algoritmo de retroceso?
El método de retroceso generalmente puede resolver los siguientes problemas:
      Problemas de combinación, problemas de permutación, problemas de subconjuntos, problemas de tablero de ajedrez y otros problemas ;
El problema de las n reinas es uno de los problemas del tablero de ajedrez ;
Los problemas a resolver mediante el método de retroceso se pueden resumir en una estructura de árbol, que puede entenderse como un árbol N-ario;
El método de retroceso utiliza la recursividad para encontrar subconjuntos de forma recursiva en un conjunto. El tamaño del conjunto puede entenderse como la capa que requiere recursividad;
Y cuando se usa la recursividad, debe haber una condición de terminación ; de lo contrario, no podrá salir del cuerpo de la función y se producirá un error. Entonces este árbol N-ario es limitado;
El proceso del algoritmo de retroceso:
 
         1. Rastree los parámetros ingresados ​​por la función y el valor de retorno, es el cuerpo de una función

         2. Condición de terminación, debido a que es recursiva, debe haber una condición de terminación.

         3. Algoritmo de retroceso central

                 Árbol N-ario: (

                     para bucle: recorrido horizontal

                      Recursión: recorrido vertical

                )

         4. Valor de retorno de salida

Esta es la introducción principal al algoritmo de retroceso.

¡Empecemos a buscar preguntas para empezar! ! !

Si te ayuda, ¡dame un visto bueno! ! !    



Requisitos de las preguntas

     Coloca n reinas en un tablero de ajedrez de n*n de manera que no puedan atacarse entre sí, es decir, no pueden estar dos reinas en la misma fila, columna o diagonal ¿Cuántas formas hay de colocarlas?

     Formato de entrada: 8

     Formato de salida: 92

Análisis de preguntas

1. Para el tablero de ajedrez de n reinas, existen estas reglas

      1. No pueden estar en la misma línea

      2. No puede estar en la misma columna.

      3. No puede estar en la misma línea diagonal.

Normalmente, para un tablero de ajedrez, usaremos una matriz bidimensional.

Pero para esta regla del juego, podemos saber que usar una matriz unidimensional está bien, porque solo se puede colocar una pieza de ajedrez en cada fila.

2. Para estas tres reglas, nuestra capa central debe tener dos juicios ( use matrices unidimensionales, no es necesario considerar problemas de filas )

      Cuando se esté preparando para colocar una reina en la columna actual, debe determinar:   

1. ¿Está la posición actual de la reina en la misma columna      que la reina que se colocó antes ? Si es así, cambie la columna hasta la enésima columna ( llega al límite ). Debe volver a la fila anterior de reinas y cambiar la columna de la fila anterior de reinas.

2. ¿Está la posición actual de la reina en la misma pendiente      que la reina colocada anteriormente ( es decir, 45° o 135° )? Si es así, cambie la columna hasta la enésima columna ( llega al límite ), y deberá volver a la posición anterior. fila de reinas. , cambia la columna de la reina de la fila anterior.

3. Condiciones de terminación en el proceso recursivo

     Podemos pensar en el algoritmo de retroceso, la explicación más sencilla es que el camino actual está bloqueado, qué hacer, retroceder, ir a la posición anterior y cambiar de dirección;

      ¿No es la condición de terminación que hayas regresado al primer paso y alcanzado la última posición del primer paso? Si no hay otra opción, entonces se acabó. ¿Por qué quedarte aquí cuando no hay camino a seguir? Jajajaja;

   

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;	
}

La creación no es fácil, ¡deja comentarios, síguenos y dale me gusta para evitar perderte! ! !

La creación no es fácil, ¡deja comentarios, síguenos y dale me gusta para evitar perderte! ! !

La creación no es fácil, ¡deja comentarios, síguenos y dale me gusta para evitar perderte! ! !

Supongo que te gusta

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