N皇后问题另类解法,将棋盘问题转换为数字排列问题

N皇后问题另类解法

琐事包围的一年,很久没写blog啦,最近练习leetcode刚好遇到N皇后问题,以前都是直接模拟棋盘来进行搜索,这次想到一个新思路。

以5皇后问题为例来分析:

  1. 首先抽象棋盘为二维数组:

    00000
    00000
    00000
    00000
    00000

  2. 皇后置放位置不同行不同列:
    00001 -> 1
    00010 -> 2
    00100 -> 4
    01000 -> 8
    10000 -> 16

    由此可以将棋盘的每一行看作一个5位的二进制数,将问题转化为数字的排列组合问题。
    N皇后问题就是 1、2、4、8、16...(2的N次方) 这N个数的排列问题。

  3. 皇后置放位置斜方向有且只有一个:
    成立的排列:
    00001 -> 1
    01000 -> 8
    00010 -> 2
    10000 -> 16
    00100 -> 4

    不成立的排列:
    00001 -> 1
    00100 -> 4
    00010 -> 2
    10000 -> 16
    01000 -> 8

    有了第二步作为基础,通过找规律可以得到一个规律:
    假设存在数组q[0],q[1]...q[k]...q[n],
    取数字N放在位置k有一个通用的约束条件:如果存在一个p位置的数,使得q[k]除以q[p]或者q[p]除以q[k]恰好等于2的(abs(p-k))次方,那么数字N放置在位置k不成立。

posted @ 2020-12-08 11:05  Devin.Zhou  阅读(203)  评论(0编辑  收藏  举报