N皇后问题另类解法,将棋盘问题转换为数字排列问题
N皇后问题另类解法
琐事包围的一年,很久没写blog啦,最近练习leetcode刚好遇到N皇后问题,以前都是直接模拟棋盘来进行搜索,这次想到一个新思路。
以5皇后问题为例来分析:
-
首先抽象棋盘为二维数组:
00000
00000
00000
00000
00000 -
皇后置放位置不同行不同列:
00001 -> 1
00010 -> 2
00100 -> 4
01000 -> 8
10000 -> 16由此可以将棋盘的每一行看作一个5位的二进制数,将问题转化为数字的排列组合问题。
N皇后问题就是 1、2、4、8、16...(2的N次方) 这N个数的排列问题。 -
皇后置放位置斜方向有且只有一个:
成立的排列:
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不成立。