说明:本代码由b站网友:万众烟火不及你 编写

仅供学习参考,转载请标明出处

代码难免存在bug,请网友海涵,以下为代码部分

本代码中,地图边界为0,与麦克老师的实例中的边界为1不同,请注意

NQueen.java :

package n_Queen;
			
import java.util.Scanner;
			
//n皇后问题,DFS
//这里以8行8列为例,即8*8的棋盘,放8个皇后
//规则:同一行,同一列,同一对角线只允许放一个皇后
public class NQueen {
	static int N = 1000;
	static int[] a = new int[N];  //a[i]表示第i行上的皇后放于第a[i]列上,若a[3] = 7,说明第3行第7列有一个皇后,若a[i] = 0,说明该位置还没有放置皇后
	static int count = 0;  //计数
	static void dfs(int row,int n){  //第row行的皇后放于何处,n表示棋盘的规模
		if(row == n){  //越界了,即产生了一组解
			count++;
			for (int x = 0; x < n; x++){  //输出棋盘
			    int p = a[x];  //第x行第p列有一个皇后,共有x行
			    for (int t = 0; t < p; t++){
			        System.out.print("X ");
			    }
			    System.out.print("Q");
			    for (int t = 0; t < n - p - 1; t++){
			        System.out.print(" X");
			    }
			    System.out.println();
			}
			System.out.println("-------");
			return;
		}
		for (int i = 0; i < n; i++){  //检查n个方位能不能放
			if(check(row, i)){   //检查第row行,第i列能不能放
			    a[row] = i;   //第row行放在第i列上
			    dfs(row+1,n);  //下一行
			    a[row] = 0;  //回溯
			}
		}
	}
			
	static boolean check(int x, int y){   //第x行能否放在第y列上
		for (int i = 0; i < x; i++){
			    if (a[i] == y || i + a[i] == x + y || i - a[i] == x - y) {   //第i列已有元素,或者对角线上有元素
			    return false;
			}
		}
		return true;
	}
			
			
	public static void main(String[] args) {
		System.out.println("请输入棋盘大小:");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();  //棋盘规模
		dfs(0,n);   //第0行开始
		sc.close();
		System.out.println("共有:"+count+"组解");
	}
}
		

测试用例:

-----以下为输入------ 

请输入棋盘大小:
4

-----以下为输出-----

X Q X X
X X X Q
Q X X X
X X Q X
-------
X X Q X
Q X X X
X X X Q
X Q X X
-------
共有:2组解