基本思路:通过回溯法一个一个去试,如果当前位置可行,。
首先,我们需要建立数组来表示棋盘,但是由于我们只需要表示皇后的位置,而且皇后一行只有一个,因此,我们可以使用以为数组来表示二维棋盘,
例如:{1,1,1,1}用来表示所有的棋子都在最左侧。
这里,我们需要调用place方法,来保证当前的位置是否与之前的位置产生冲突。这里有一个细节,皇后的斜线攻击满足长和宽相等,因此,我们确保两棋子的坐标差的绝对值相等就可以了。
这里主要的功能就是BackTrack方法,这个是对棋盘的每一行进行填充,这里使用了回溯思想,没满足一次,我们就开始下一行,当行数 t 超过棋盘大小时,就说明满足要求,sum++。
class Nqueen{
int n;
int []x;
int sum;
public Nqueen(int ix){ //绘制坐标,用一维数组实现二维表示
n=ix;
x=new int[ix];
sum = 0;
}
boolean place (int t){ //判断当前结点是否满足要求,需要从以前的坐标去对比
for (int i =0;i<t;i++){
if (x[i] ==x[t] || (t-i) == Math.abs(x[t]-x[i])){
return false;
}
}
return true;
}
void BackTrack(int t){ //对每一行进行填充
if (t>=n) {
sum++;
PrintQ();
}
else {
for (int i =0;i<n;i++){ //一个一个的去尝试放棋子,
x[t]=i;
if (place(t)){ //如果满足要求,就开始下一行。
BackTrack(t+1);
}
}
}
}
public int nqueen(){
BackTrack(0);
return sum;
}
public void PrintQ(){
for (int i= 0;i<n;i++){
for (int j= 0;j<n;j++){
if (x[i] ==j){
System.out.print("@");
}
else {
System.out.print("#");
}
}
System.out.println();
}
System.out.println();
}
}
public class test_n_queen {
public static void main(String[] args) {
Nqueen Q =new Nqueen(8);
int num = Q.nqueen();
System.out.println(num);
}
}