【leetcode】51. N皇后

題目:

回想起來8皇后問題是當時算法課考試的最後一題,看分數的話這題當時應該是寫錯了不得分。

答案:

慚愧,還是沒能寫出來對的答案,只是大致知道用回溯法,編程能力還是不夠。

答案轉自:https://blog.csdn.net/xygy8860/article/details/46861381

    public class Solution {  
        /** 
         * 這題的整體思想是建一個x[n]的數組,意爲第i放第x[i]列放置皇后 
         * 皇后的合法判斷規則是列不相等,斜線上也不相等 
         * i + x[i] == j + x[j] 表示正斜線一致 
         * x[i] - i = x[j] - j 表示負斜線上一致  都不合法 
         */  
        List<List<String>> list;//保存結果  
        public List<List<String>> solveNQueens(int n) {  
            list = new  ArrayList<List<String>>();  
            int[] x = new int[n];//保存結果  
            queens(x, n, 0);  
            return list;  
        }  
          
        void queens(int[] x,int n,int row){  
            for(int i = 0; i < n; i++){  
                if(check(x,n,row,i)){//判斷合法  
                    x[row] = i;//將皇后放在第row行,第i列  
                    if(row == n-1){//如果是最後一行,則輸出結果  
                        addList(x,n);  
                        x[row] = 0;//回溯,尋找下一個結果  
                        return;  
                    }  
                    queens(x, n, row+1);//尋找下一行  
                    x[row] = 0;//回溯  
                }  
            }  
        }  
      
        /** 
         * 將每一組的結果添加list 
         * @param x 數組解 
         * @param n 棋盤長寬 
         */  
        private void addList(int[] x,int n) {  
            //添加結果  
            String[][] sArr = new String[n][n];  
            List<String> al = new ArrayList<String>();  
            for(int i = 0; i < n ; i++){  
                Arrays.fill(sArr[i], ".");//先填充.  
                sArr[i][x[i]] = "Q";//特定位置放置Q  
                String s = "";  
                for(String str:sArr[i]){  
                    s += str;//加在一起  
                }  
                al.add(s);//添加一行  
            }  
            list.add(al);//添加一組解  
        }  
      
        /** 
         * @param x 數組解 
         * @param n 棋盤長寬 
         * @param index 當前放置行 
         * @param i 當前放置列 
         * @return 
         */  
        boolean check(int[] x,int n,int row, int col){  
            for(int i = 0; i < row; i++){  
                //因爲行不相等,判斷列是否相等,斜線上是否相等  
                if(x[i] == col || x[i] + i == col + row || x[i] - i == col - row)  
                    return false;  
            }  
            return true;  
        }  
    }  

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