1.N皇后问题的定义
N皇后问题的定义:在一个N*N的矩阵中,放置N个皇后,需要满足三个条件
【1.每一列只有一个皇后;
2.每一行只有一个皇后;
3.对角线上只有一个皇后】
穷举法可以解决这个问题,但是他需要遍历全部位置,效率最差;
回溯法相当于是优化的穷举法,回溯在遇到不满足情况的放置时就会回溯,重新放置。
四皇后的正确放置
四皇后的错误放置
很明显,第二张图片的[1,2]位置的皇后和[2,3]位置的皇后出现在对角线上
2.java描述如何解决N皇后问题
public class BackTraceCustom2 {
public static void main(String[] args) {
NQueenQuestion2 nq=new NQueenQuestion2();
System.out.println(nq.totalAnswer(8));
}
}
//解决N皇后的类
class NQueenQuestion2{
//皇后个数
int N;
//存放可行的解
int[] x;
//解的个数
int sum=0;
//初始化属性
public int totalAnswer(int n) {
N=n-1; //-1的原因:数组是基0开始的,所以0 1 2 3对应1 2 3 4
x=new int[n]; //n个皇后由长度n的数组存储
backTrace(0); //从第0行开始放置皇后,backTrace中出现可行解会对sum加1
return sum;
}
//当前放置的行是row
public void backTrace(int row) {
if(row>N){
System.out.println(Arrays.toString(x)); //打印结果
sum++;
}else {
//将皇后放置到正确的[row,i]--row表示行,i表示列
for(int i=0;i<=N;i++) {
x[row]=i; //x[row]临时存放i,用于调用place方法判断位置是否正确时使用
if(place(row)) {
backTrace(row+1);
}
}
}
}
//放置皇后到[row,col]
public boolean place(int col) {
for(int j=0;j<col;j++) {
//如果col列出现其他皇后,将皇后放到当前行的下一列
if(x[col] == x[j])
return false;
//如果对角出现其他皇后,将皇后放到当前行的下一列
if(Math.abs(col-j) == Math.abs(x[col]-x[j]))
return false;
}
return true;
}
}