Hablar de n queen

Coloque n reinas en un tablero de ajedrez n * n, requiriendo la misma fila y la misma columna. No se pueden colocar dos barras.
Este es un simple problema de retroceso.
Pero cómo juzgar si se puede liberar es difícil.


En ese momento, pensé en abrir una matriz bidimensional para juzgar si se puede poner esta coordenada.
Pero hay un problema aquí. Las barras de dos reinas (1 y 2) pueden tener foco. Luego restableceremos esta coordenada cuando retrocedamos (retroceso desde la reina 2). Pero en este caso, la barra de la reina 1 no tiene ningún efecto.


La reina se coloca desde la fila 0 y solo puede haber una reina en una fila, por lo que la i-ésima reina también es la i-ésima fila.
Use una bandera de matriz para representar. flag[i]=jEsto indica que la reina en la fila i se coloca en la columna j.
De esta manera, al considerar la línea diagonal, puede usar la pendiente de la línea recta de dos puntos (Y1-Y2 / X1-X2).

#include<iostream>
#include<set>
#include<vector> 
using namespace std;
int ans=0;
int flag[100];//flag[i]=j, 第i个皇后的列数j 
bool place(int col,int row){
	for(int i=0;i<row;i++){ //找出已经放置的queen的行,判断他们与将要放的queen是否冲突
		if(flag[i]==col||abs(i-row)==abs(col-flag[i])) return false;
	}
	return true;
}
void dfs(int n,int row){
	if(row==n){
		ans++;
		return;
	}
	for(int i=0;i<n;i++){//列数	
		if(place(i,row)){//判断第row行,第i列可不可以放queen
			flag[row]=i;
			dfs(n,row+1);
			//flag[row]=0;
			//发现去掉这里也没事,原因:我们先判断再放,所以回溯也没事。
		}
	}	
}
int main(void){
	int n=4;
	dfs(n,0);
	cout<<ans;
}
161 artículos originales publicados · Me gusta 68 · Visitantes más de 20,000

Supongo que te gusta

Origin blog.csdn.net/qq_43179428/article/details/105340933
Recomendado
Clasificación