说明:本代码由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组解