回溯法解决八皇后问题(使用JAVA)...

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

点赞