Análisis de vuelta hacia atrás desde el problema de las ocho reinas

En primer lugar, vamos a ver cuál es el problema de las ocho reinas
a cabo ocho reinas en el tablero de ajedrez 8 * 8 sin atacarse unos a otros (es decir, cualquier fila de la tabla, y cualquiera de las dos reinas no pueden ser colocados en diagonal)
Aquí Insertar imagen Descripción

Esta pregunta es el uso de retroceso algoritmo, entonces lo que se marcha atrás algoritmo?

En pocas palabras, la primera tentativa hacia adelante, de acuerdo con un método, no se encuentra este método cuando la solución óptima o no puede alcanzar el objetivo, paso atrás , sustituidos una manera de seguir la prueba, saber dónde encontrar la fecha de finalización

De hecho marcha atrás algoritmo tiene una rutina muy similar

void go(int k)
{
    for(i=1;i<=k;i++)
    {
  	if(符合条件)
  	{
  		 ……
   		if(到达终点) {}
   		else go(k+1);
   		//进行回溯
   		返回一步 …… 
  	} 
    }
} 

Entonces el problema reinas ocho es la misma razón
, tal como
Aquí Insertar imagen Descripciónprimero en el (1,1) se coloca primero Queen
luego se coloca en la segunda línea de la segunda Queen
primera introduzca la (2,1), encontró que el primer conflicto, la derecha, llega (2,2) también encontraron que el primer conflicto, continuar hacia la derecha, alcance (2,3), no hay conflicto, por lo que la segunda ocupación exitosa de la Reina
Aquí Insertar imagen Descripción

El tercer proceso Queen ocupaba la misma razón, el primero en llegar (3,1), que se encuentra (1,1) conflicto, la derecha, alcance (3,2) encontrado (2,3) conflicto, la derecha, llega ( 3,3) y (2,3) conflicto, a la derecha, alcance (3,4) y (2,3) conflicto, a la derecha, alcance (3,5), no hay conflicto, la ocupación exitosa

Aquí Insertar imagen Descripción
Entonces, ¿cómo se reflejan de vuelta?
Al igual que la figura siguiente
Aquí Insertar imagen Descripción

En este punto hemos completado siete antes de llenar la Reina, pero se encontró que no importa cuál de las ocho reinas estará en conflicto con otras reinas, a continuación, damos un paso atrás, los primeros siete Queens cambian de lugar, continuar hacia la derecha, en la ( 7,7) con un cuarto de conflictos Reina, (7,8) y un segundo conflictos Reina, esta séptima posición de la reina no tiene otra opción, que continuará a dar marcha atrás, moviendo los primeros seis reinas, su derecho constantemente en busca de la ubicación correcta

Esta es la parte de atrás
de manera específica, cómo hacer frente a este problema, entonces ocho reinas

En primer lugar, debe saber que, con el fin de evitar el conflicto no debe estar en la misma línea, la misma columna, no hay dos reinas en la diagonal

Aquí Insertar imagen DescripciónFácilmente disponibles de la figura, los mismos elementos en la esquina inferior derecha de la calzada, el número de líneas - es siempre el mismo número de columnas

Lo mismo se puede ver, los elementos diagonales de la parte inferior izquierda al número de filas + número de columnas es siempre la misma

A continuación, puede obtener generalmente códigos clave

Preparación de una reina matriz, que representa los elementos lugar en la columna j i-ésima fila de la Reina [i] = j;
Flag misma matriz columna representa si el conflicto
d1 indican si el conflicto a la diagonal inferior derecha, 7 aquí es permitir que todos los números negativos se han convertido en no negativo
si (n <8) dice que ocho reinas no está lleno, pero también es necesario continuar recursivamente
imprimir lo contrario los resultados

Los siguientes resultados de impresión atrás sólo después del final de la etapa se puede ejecutar en este momento, tenemos que deshacer el último paso, a buscar otros resultados

//判断位置是否冲突 
if((!flag[col])&&(!d1[n-col+7])&&(!d2[n+col]))
  {
   queen[n]=col;//在第n行放置皇后 
   flag[col]=1;//占领col列 
   d1[n-col+7]=1;//占领两个对角线 
   d2[n+col]=1;
   if(n<8)
    display(n+1);//8个皇后没有摆完,就继续递归 
   else
    print();//n=8说明已经排列完成 
   
   //回溯:考虑其他可行方案 
   flag[col]=0;
   d1[n-col+7]=0;
   d2[n+col]=0;  
  }

Se adjunta a continuación el código completo

#include<iostream>
using namespace std;

int queen[9]={0};//第i个皇后所在列数 
int flag[9]={0,0,0,0,0,0,0,0,0};//表示第i列是否可占 
int d1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//表示“/”对角线是否可占 
int d2[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//表示“\”对角线是否可占
int number=0;//种类数 

void print();//打印函数 
void display(int n);//回溯函数 

int main()
{
	display(1);
	return 0;
}
void display(int n)
{
	int col;
	for(col=1;col<=8;col++)//每种皇后都有8种可能 
	{
		if((!flag[col])&&(!d1[n-col+7])&&(!d2[n+col]))//判断位置是否冲突 
		{
			queen[n]=col;//在第n行放置皇后 
			flag[col]=1;//占领col列 
			d1[n-col+7]=1;//占领两个对角线 
			d2[n+col]=1;
			if(n<8)
				display(n+1);//8个皇后没有摆完,就继续递归 
			else
				print();//n=8说明已经排列完成 
			
			//回溯:考虑其他可行方案 
			flag[col]=0;
			d1[n-col+7]=0;
			d2[n+col]=0;		
		}
	}
}
void print()
{
	int col,i,j;
	number++;
	cout<<"No."<<number<<endl;
	int table[9][9]={0};
	for(col=1;col<=8;col++)
	{
		table[col][queen[col]]=1;
	}
	for(i=1;i<=8;i++)
	{
		for(j=1;j<=8;j++)
		{
			cout<<table[i][j]<<" ";
		}
		cout<<endl;
	}
}

Resultados son como sigue, se encontró que 92 posible 8 Queen

Aquí Insertar imagen Descripción
Por esto conocemos, dando marcha atrás algoritmo es similar a un proceso de tentativa de enumeración, en la búsqueda de descubrimiento no ha satisfecho
cuando las condiciones de contorno, en la "atrás" para volver a intentar un camino diferente, entrar en él, después no se puede pasar de nuevo en el

Si este artículo útil para usted, recuerde que debe alabar punto de enfoque oh

Publicado 37 artículos originales · ganado elogios 3 · Vistas 1163

Supongo que te gusta

Origin blog.csdn.net/qq_45721778/article/details/105330358
Recomendado
Clasificación