52.N皇后II

题目描述:

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 *n *皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例:

示例:
输入: 4
输出: 2
解释: 4 皇后问题存在两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],

["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]

解答:回溯

// n皇后问题是典型的回溯法,即任何两个皇后不能在同一行同一列或同一对角线
    public static int totalNQueens(int n) {
        List<List<String>> rs = new ArrayList<List<String>>();
        // 第i个位置存的数表示:row行,Q的列
        int[] queen = new int[n];
        // 在第0行放Q
        placeQueen(queen, 0, n, rs);
        for (int i = 0; i < rs.size(); i++) {
            for (int j = 0; j < rs.get(0).size(); j++) {
                System.out.print(rs.get(i).get(i) + ";");
            }
            System.out.println();
        }
        return rs.size();
    }

    private static void placeQueen(int[] queen, int row, int n, List<List<String>> rs) {
        // 如果已经填满Q,返回结果
        if (row == n) {
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < n; i++) {
                String str = "";
                for (int col = 0; col < n; col++) {
                    if (queen[i] == col) {
                        str += "Q";
                    } else {
                        str += ".";
                    }
                }
                list.add(str);
            }
            rs.add(list);
        }
        // 第row个Q开始,从每一列开始遍历
        for (int col = 0; col < n; col++) {
            // 当当前列不满足条件时,查看下一列        
            // 如果在该列不冲突,就添加[满足时才添加,或者先queen[row] = col,再valid]
            if (isValid(queen, row, col)) {
                // 数组中存放:第row个Q所在的列
                queen[row] = col;
                // 继续放下一个Q,即下一行,row+1
                placeQueen(queen, row + 1, n, rs);
            }
        }
    }

    private static boolean isValid(int[] queen, int row, int col) {
        // 与之前已经放好的Q一一比较
        for (int i = 0; i < row; i++) {
            // pos即之前每一Q所在的列
            int pos = queen[i];
            // 同一列/右下、左上对角线/左下、右上对角线
            /*
            if (pos==col||Math.abs(col-pos)==row-i) {
                return false;
            }
            */
            // 同一列
            if (pos == col) {
                return false;
            }
            // 右下、左上对角线
            // 上一Q的列 + 这一Q的行 - 前面所有Q个数
            if (pos + row - i == col) {
                return false;
            }
            // 左下、右上对角线
            // 上一Q的列 - 这一Q的行 + 前面所有Q个数
            if (pos - row + i == col) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        totalNQueens(4);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,386评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,504评论 3 416
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,324评论 0 374
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,968评论 1 311
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,733评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,194评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,259评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,412评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,947评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,779评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,978评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,521评论 5 359
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,217评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,647评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,886评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,658评论 3 391
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,963评论 2 373

推荐阅读更多精彩内容

  • n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 皇后...
    vbuer阅读 392评论 0 0
  • 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图...
    夜空中最亮的星_6c64阅读 357评论 0 0
  • 问题描述 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(不同行,不同列,不同对角线)。给定...
    Alfie20阅读 625评论 0 0
  • 题目n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 上图为 8 ...
    HITZGD阅读 548评论 0 0
  • 2017-06-02兔了个崽子 前几天,兔妈和几个闺密相约聚会,谈论起各自的生活日常。 小美,其实是枚大美女。大胸...
    frank4li阅读 306评论 0 0