【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;  
        }  
    }  

阅读更多

没有更多推荐了,返回首页