El puente azul de la Copa ejercicios básicos 2n Queens

El puente azul de la Copa ejercicios básicos 2n Queens

Descripción del problema
  Dado un n * n tablero, el tablero no se puede poner en la posición de algunos de la Reina. Para ahora tablero negro colocado n y n-reinas White Queen, de modo que cualquiera de los dos reinas negras no están en la misma línea, misma columna o la misma línea diagonal, dos cualquiera reina blanca no en la misma fila, la misma columna o la misma diagonal. P. Un total de cuántos poner la ley? n es 8 o menos.
Formato de entrada
  de entrada actúa un primer número entero n, el tamaño de la placa.
  Posteriormente n filas, cada fila de n un número entero de 0 o 1, si a es un número entero de 1, lo que indica la posición correspondiente a la reina se pueden colocar, si a es un número entero de 0, lo que indica la posición correspondiente a la descarga no puede ser reina.
Formato de salida
  de salida de un entero que representa el número total de especies puso ley.
de entrada de la muestra:

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

Resultado de muestra:
2

de entrada de la muestra:

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

Resultado de muestra:
0

Esquema de Solución
Antes de esta solución problema, necesidad de entender el n-reinas problema, la referencia puede un blog en adelante
N Queens
pregunta siguiente describe la principal idea
principal diferencia entre ny 2n reina reinas problema es que, en el 2n reinas problema, es necesario en el que la colocación de un color Queen registro, después de la colocación, cuando la reina y poner otro color se ha colocado en la posición de derivación.
Utilizo un método de búsqueda en profundidad, pantalla negro primero Queen, registrar la posición de visualización, la visita [i] [j] array se establece en 1 (i, j es una cruz de coordenadas) se colocan Queen negro purgado, empezar a colocar la Reina blanco, el mismo principio, sólo para asegurar que cuando se coloca de Visita [i] [j] == 0 puedo ser.
código específico de la siguiente

El código (C ++)

#include<iostream>
#include<cmath>
#define maxsize 8
using namespace std;
int n;
int num=0;//输出结果 符合条件的摆法
int res_b[maxsize]; //符合条件的黑皇后摆放序列
int res_w[maxsize];//符合条件的白皇后摆放序列
int map[maxsize][maxsize]; 
int visit[maxsize][maxsize];//记录
int dfs_white(int step);
int dfs_black(int step);
bool check_b(int step);
bool check_w(int step);
int main()
{
	cin>>n;

	for(int i=0;i<n;i++)
	  for(int j=0;j<n;j++)
	  {
	  	cin>>map[i][j];
	  	visit[i][j]=0;
	  }
	dfs_black(1); 
	cout<<num; 
	return 0;
	
}
int dfs_white(int step)
{
 if(step==n+1)//白皇后全部摆放完成
  {
  	num++;
  }	
  for(int i=0;i<n;i++)
  {
  	if(!map[i][step-1]||visit[i][step-1]==1) //是否能存放皇后 
  	continue;
  	res_w[step-1]=i;
	if(check_w(step))
	{
		visit[i][step-1]=1;
		dfs_white(step+1);
		visit[i][step-1]=0;
	}
  	
  }	
}
int dfs_black(int step)
{
  if(step==n+1)
  {
  	dfs_white(1);//黑皇后全部摆放完成,开始统计白皇后
  }	
  for(int i=0;i<n;i++)
  {
  	if(!map[i][step-1]) //是否能存放皇后 
  	continue;
  	res_b[step-1]=i;
	if(check_b(step))
	{
		visit[i][step-1]=1;
		dfs_black(step+1);
		visit[i][step-1]=0;
	}
  	
  }
}

bool check_b(int step)
{
	for(int i=0;i<step-1;i++)
	{
		if(res_b[i]==res_b[step-1]||abs(step-1-i)==abs(res_b[step-1]-res_b[i])) //保证摆放的位置之前没有出现过 和不在对角线上
		return false;
	}
	return true;
}
bool check_w(int step)
{
	for(int i=0;i<step-1;i++)
	{
		if(res_w[i]==res_w[step-1]||abs(step-1-i)==abs(res_w[step-1]-res_w[i]))//保证摆放的位置之前没有出现过 和不在对角线上
		return false;
	}
	return true;
}

(Hay un pozo en la taza azul del puente de zumo de naranja, el sexto punto no tengo, pero mi producción en 2406 es la derecha)
acaba de empezar a escribir el blog, hay un problema por favor avise

Publicado ocho artículos originales · ganado elogios 0 · Vistas 709

Supongo que te gusta

Origin blog.csdn.net/Daturasee/article/details/104784543
Recomendado
Clasificación