Java ilustrado con problemas de ocho Queens-N Queens

Inserte la descripción de la imagen aquíIdea: Creo que todos ya conocen el significado de una pregunta clásica como las ocho reinas, ¿qué debemos hacer? Tomemos
un ejemplo: Inserte la descripción de la imagen aquíla premisa de que el punto verde puede existir es que 它的左下方的那条斜线上、右上方那条斜线上以及它所在的这一列和这一行上no hay otra "reina", entonces salen las cuatro condiciones que necesitamos cuando buscamos.

De acuerdo con el significado del título, finalmente obtendremos una matriz. El ejemplo dado por el título 2,4,6,1,3,5significa que la "Reina" en la primera fila debe colocarse en la segunda columna, y la reina en la segunda fila debe colocarse en la cuarta columna, y así sucesivamente. , Entonces podemos usar una matriz unidimensional para representar todos los estados, es decir arr[i]=j 第i行的皇后应该放在第j列, de esta manera, no necesitamos juzgar si hay otras "reinas" en la misma línea, porque la búsqueda es desde el siguiente nivel hacia arriba, De esta manera definitivamente no estará en la misma línea.

Ahora hay otras tres condiciones: 1.左下方斜线 2.右上方斜线 3.同一列上miramos la Inserte la descripción de la imagen aquí
palabra de relación feo de la imagen y esperamos que no nos importe.
Podemos usar la matriz para juzgar si hay una "Reina" en la diagonal izquierda y derecha del punto
left[x+y]=true 表示x,y这点的左斜已经有皇后了,left[x+y]=boolean,则表示没有.

El punto del ejemplo es especial, xy no será menor que cero, pero en la operación real habrá puntos menores que cero, así que tenemos que sumar n a cada valor de xy para asegurarnos de que las coordenadas no sean negativas right[x-y+n]. En cuanto a por qué no usamos valores absolutos Puedes probarlo.

Determine si la "Reina" ya existe en la columna y abra una matriz como se indicó anteriormente.

el código se muestra a continuación:

import java.util.Scanner;
public class Main {
    
    
		
		    static boolean left[]=new boolean[40];   //:左上到右下      在同一条斜线上的横坐标减纵坐标绝对值相等
			static boolean right[]=new boolean [40];  //:右上到左下	   在同一条斜线上的横坐标加纵坐标值相等
			static boolean lie[]=new boolean[40];
			static int count=0;  //计算个数,超过三个就不输出了
			static int a[]=new int[40];
			
		
			public static void main(String[] args) {
    
    
				Scanner input=new Scanner(System.in);
				int n=input.nextInt();
				DFS(1,n);
                System.out.println(count);
			
			}
		public static void DFS(int x,int n) {
    
    
			if(x>n) {
    
    
               if(count<=2){
    
    
				for(int i=1;i<=n;i++)
					System.out.print(a[i]+" ");
				System.out.println();
				
}
                count++;
				return ;
			}
			for(int i=1;i<=n;i++) {
    
    
				if(!lie[i]&&!left[x-i+n]&&!right[x+i]) {
    
    
					lie[i]=true;
					left[x-i+n]=true;
					right[x+i]=true;
					a[x]=i;
					DFS(x+1,n);
					//回溯
					lie[i]=false;
					left[x-i+n]=false;
					right[x+i]=false;
				}
				
			}
			
		}

}

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/107939488
Recomendado
Clasificación