Notas de estudio de las ocho reinas-C++
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
:
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:
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
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;
}
}
}