• 皇后问题的经典做法


    求个数,和打印全部,都可以用下面这种非常简洁的代码结构,来做。

    /**
     * don't need to actually place the queen,
     * instead, for each row, try to place without violation on
     * col/ diagonal1/ diagnol2.
     * trick: to detect whether 2 positions sit on the same diagnol:
     * if delta(col, row) equals, same diagnol1;
     * if sum(col, row) equals, same diagnal2.
     */
    private final Set<Integer> occupiedCols = new HashSet<Integer>();
    private final Set<Integer> occupiedDiag1s = new HashSet<Integer>();
    private final Set<Integer> occupiedDiag2s = new HashSet<Integer>();
    public int totalNQueens(int n) {
        return totalNQueensHelper(0, 0, n);
    }
    
    private int totalNQueensHelper(int row, int count, int n) {
        for (int col = 0; col < n; col++) {
            if (occupiedCols.contains(col))
                continue;
            int diag1 = row - col;
            if (occupiedDiag1s.contains(diag1))
                continue;
            int diag2 = row + col;
            if (occupiedDiag2s.contains(diag2))
                continue;
            // we can now place a queen here
            if (row == n-1)
                count++;
            else {
                occupiedCols.add(col);
                occupiedDiag1s.add(diag1);
                occupiedDiag2s.add(diag2);
                count = totalNQueensHelper(row+1, count, n);
                // recover
                occupiedCols.remove(col);
                occupiedDiag1s.remove(diag1);
                occupiedDiag2s.remove(diag2);
            }
        }
        
        return count;
    }
  • 相关阅读:
    Java 小记 — Spring Boot 的实践与思考
    Docker 小记 — Compose & Swarm
    Linux 小记 — 网络管理
    Docker 小记 — Docker Engine
    Nginx 原理解析和配置摘要
    笔记与随想 — 解决问题
    Mac 小记 — 杂录
    编剧小记 — Contour
    Linux 小记 — Ubuntu 自动化配置
    dotnetcore 自动迁移工具
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6445411.html
Copyright © 2020-2023  润新知