51. N-Queens

這題是dfs套路,按照常理想的話我們需要一個存儲坐標(biāo)的數(shù)據(jù)結(jié)構(gòu),但這題只要一個一維數(shù)組就夠了,因為n皇后的橫坐標(biāo)正好是0~n-1,而且每個slot只會有一個皇后。那表,(row,col(row))就代表Queen的坐標(biāo)。
對于4皇后,前兩次遞歸的樣子是這樣的:
首先,找到了row == 2的時候,發(fā)現(xiàn)每一個slot都不符合條件,咋辦呢,不能繼續(xù)DFS下去了,
結(jié)果集是(0,0) (1,2) (2,3) ____
col [] = {0,2,3,0} 第四個0是初始化的
這時候按理說應(yīng)該結(jié)束上次DFS,然后去掉上次加進來的那個數(shù)字,
1000
0010
0001
0000

如果是這樣的二維數(shù)組,就要把(2,3)的那個皇后拿走,置0,這樣才能在第3行重新放一個皇后,但一維數(shù)組只有一個坑啊,回到row-1,再下來的時候,col[2]自然會被覆蓋。所以不用remove操作。

下面的代碼看上去很長,其實dfs函數(shù)的部分只有底下的遞歸是核心,上面的if是用來打印結(jié)果的。
這題就是典型的for循環(huán)里面進行遞歸的問題。在dfs條件不滿足的時候

    public List<List<String>> solveNQueens(int n) {

        List<List<String>> res = new ArrayList<>();
        if (n <= 0)
            return res;

        dfs(res, 0, n, new int[n]);
        return res;
    }

    //columnVal橫坐標(biāo)表示Q所在行,縱坐標(biāo)表示Q所在列
    public void dfs(List<List<String>> result, int row, int n, int[] col) {
        if (row == n) {
            //col = [1,4,0,3];
            List<String> cell = new ArrayList<>();
            for (int i = 0; i < row; i++) {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < row; j++) {
                    if (col[i] == j) {
                        sb.append("Q");
                    } else {
                        sb.append(".");
                    }
                }
                cell.add(sb.toString());
            }
            result.add(new ArrayList<String>(cell));
            return;
        }
        for (int i = 0; i < n; i++) {
            col[row] = i;
            if (checkValid(row, col)) {
                dfs(result, row + 1, n, col);
            }
        }

    }

    public boolean checkValid(int row, int[] col) {
        for (int i = 0; i < row; i++) {
            if (col[i] == col[row] || Math.abs(i - row) == Math.abs(col[i] - col[row]))//同一列 || 斜線
            {
                return false;
            }
        }
        return true;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 不知道簡書搞什么。。剛才編輯了一下這個文章(原本是3.4寫的),結(jié)果更新之后URL失效了,怎么也找不到了。。還好之...
    DrunkPian0閱讀 303評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,935評論 0 33
  • 原題 n皇后問題是將n個皇后放置在n*n的棋盤上,皇后彼此之間不能相互攻擊。給定一個整數(shù)n,返回所有不同的n皇后問...
    Jason_Yuan閱讀 2,163評論 0 0
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 14,027評論 0 89
  • 這是一道很經(jīng)典的題目,相信很多程序員都知道。 其實解題的思路很簡單,就是在每行枚舉選擇每個位置,判斷選則的位置是否...
    ShutLove閱讀 402評論 0 0

友情鏈接更多精彩內(nèi)容