Notas de estudio del problema de las ocho reinas.

Enlace del curso en línea

 Vi que la clase en línea es un profesor de gato perezoso - lenguaje C - función recursiva - problema de las ocho reinas (búsqueda, retroceso)

diagonal superior

 La llamada diagonal superior se refiere a n-col (número de fila menos número de columna), pero cuando la usamos nuevamente por conveniencia, generalmente usamos (n-col + 7), que son todos números positivos, como se muestra a continuación
 :
diagonal superior
 son 15 barras en total;
 por lo tanto, necesitamos 15 variables bool para representar el estado de cada diagonal
bool d1[14];, cada valor bool representa una diagonal, y qué valor es falso representa qué línea no puede colocar una reina

diagonal inferior

 La llamada diagonal inferior se refiere a n+col (número de fila + número de columna), como se muestra en la siguiente figura:

diagonal inferior
 hay 15 barras diagonales,
 por lo tanto, necesitamos 15 variables bool para representar el estado de cada línea diagonal
bool d2[14];, cada una de las cuales El valor bool representa una línea diagonal, cuyo valor es falso representa qué línea no puede colocar la reina.

ideas de programas

Alt.

Código C++ completo

#include<iostream>
using namespace std;

/*8皇后问题*/
void gernerate(int num);

//四个公用变量数据初始化 
int place[8];	//第n行皇后所占位置的行号
bool flag[8] = {
    
    1,1,1,1 ,1,1,1,1};	//col列上是否可以放皇后 ,可以放置是真,不可以是假 
bool d1[14]={
    
    1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1};	//(n,col)所在上对角线上是否可以放置皇后?
bool d2[14]={
    
    1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1};	//(n,col)所在下对角线上是否可以放置皇后?
int number=0;		//how many answers does the progrem have


int main(){
    
    
	gernerate(0);
	cout<<number<<endl;
	return 0;
}

void gernerate(int n){
    
    //num is the line of queen
	for(int col=0;col<8;col++) {
    
    
		if(flag[col]&&d1[n-col+7]&&d2[n+col]){
    
    
			place[n]=col;		//放置皇后 
			
			//占领col列及上下对角线 
			flag[col]=false;	
			d1[n-col+7]=false;
			d2[n+col]=false;
			
			/*如果n小于7,那么对下一行进行递归
				否则(n=7),那就是找到了一种方式来摆放
				所以number++; 
			*/
			if(n<7)
				gernerate(n+1);
			else 
				number++;
			
			//释放col列及上下对角线 
			flag[col]=true;
			d1[n-col+7]=true;
			d2[n+col]=true;
		}
	}
}

Supongo que te gusta

Origin blog.csdn.net/Stanford_sun/article/details/123266703
Recomendado
Clasificación