假设现在的棋盘大小为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; } }