天天看點

回溯法解決八皇後問題(使用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;
    }
}