假設現在的棋盤大小為N*N,我們需要找出所有皇後位置的解。
基本思想如下:
定義個List,用于存放皇後位置解。
1.從第一行開始,找出第一個可以放置皇後的位置
2.若找出則将其加入到List尾部,并進入下一行,找出該行第一個可以放置皇後的位置。若沒有找到,将List尾部的結點去掉,回溯到上一行去找那一行中下一個可以放置皇後的位置。重複2
若檢查到List中已經有了N個元素,即List中的N個元素正是一組皇後位置的解,則将List中所有元素輸出,并将List尾部結點去掉。
若已經是最後一列,則回溯到上一行。
下面是代碼實作
import java.util.LinkedList;
import java.util.List;
public class Main {
private static int sum=0;
public static void main(String[] args) {
fun(0, 8, new LinkedList<Point>());
}
public static void fun(int i,int n,List<Point> list){
Point point = null;
for(int j=0 ;j < n ;j++){
point = new Point(i, j);
boolean flag = checkPosition(point,n,list);
if(flag){
list.add(point);
if(list.size() != n){
fun(i + 1, n, list);
}else{
System.out.println("第"+(++sum)+"種"+list);
((LinkedList<Point>) list).removeLast();
}
}
if(j == n-1){
if(i != 0){
((LinkedList<Point>) list).removeLast();
}
}
}
}
public static boolean checkPosition(Point point,int n,List<Point> list){
for (Point onePoint:
list) {
if(point.getX() == onePoint.getX() || point.getY() == onePoint.getY()){
return false;
}
if(Math.abs(point.getX()-onePoint.getX()) == Math.abs(point.getY()-onePoint.getY())
){
return false;
}
}
return true;
}
}