景兄弟手撕算法之八皇后問題

package test1;

/**
 * 回溯思想,八皇后問題:任意兩個皇后都不能處於同一行、同一列或同一斜線上
 */
public class BackTest {
    //皇后數組
    private int[] queen;

    public void backMethod(int n){
        //皇后數組初始化
        queen = new int[n];

        //初始化皇后起點
        for(int i=0;i<queen.length;i++){
            queen[i] = -1;
        }
        //從第一個皇后開始
        int k = 0;
        while (true){
            //第K個皇后要移動一個位置
            queen[k]+=1;
            //判斷是否應該回到上一行搜索
            if(queen[k]>=n){
                //皇后越界,此行沒有位置可以放置皇后
                if(k>0){
                    queen[k]=-1;
                    k--;
                    continue;
                }else {
                    break;
                }
            }
            if(!isMatch(k)){
                k++;
                if (k>=n){
                    for (int i=0;i<n;i++){
                        System.out.print(queen[i]+"");
                    }
                    System.out.println();
                    k--;
                }
            }
        }

    }
    //判斷我們第K個皇后是否與之前之後的皇后衝突
    public boolean isMatch(int k){
        for (int i=k-1;i>-1;i--){
            if(queen[k]==queen[i] ||Math.abs(queen[k]-queen[i])==Math.abs(k-i)){
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        new BackTest().backMethod(8);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章