组合数学研究-N皇后问题及其扩展

N皇后问题

国际象棋里的皇后可以攻击同一行、同一列,同一斜行的任何棋子。
N皇后问题:是要求在一个NxN的棋盘上面,放置N个皇后,使得任何一个皇后都不会攻击到其他皇后。
N皇后问题的解存在大量的中心对称的图案,一些比较美观的解会在下面展示。
2N皇后问题是N皇后的扩展:当我们解决了N皇后问题之后,会发现棋盘上有很多空闲的区域。我们是否可以再放入第二组N皇后,并要求同一组内的N个皇后不能互相攻击,但不同组的皇后之间彼此不受影响。
扩展N皇后问题:一个NxN的棋盘,最多可以放置几组N皇后?

阶数456789101112
N皇后独立解数12161246923411787
N皇后中心对称数11121431220
扩展组数25476781110

扩展N皇后的组数G(N):
如果N不是2或3的倍数,则G(N)=N; 否则猜测当N>=4时,有G(N)=N-2。
因为当N是大于4的质数时,扩展组数G(N)=N,所以可以用来构造N*P阶的解(构造方式可以研究最后的代码),此时仍然有G(N*P)=N*P。
当N为大于3且小于23的偶数时(8例外),都发现可以放置N-2组皇后,且所有皇后都分布在对角线以外的位置,只留下一个大写的 X 在中间。

阶数扩展N皇后N皇后N皇后
4 . 1 2 . 2 . . 1 1 . . 2 . 2 1 . \begin{matrix}.&1&2&.&\\2&.&.&1&\\1&.&.&2\\.&2&1&.&\end{matrix} .21.1..22..1.12. . 1 . . . . . 1 1 . . . . . 1 . \begin{matrix}.&1&.&.&\\.&.&.&1&\\1&.&.&.&\\.&.&1&.&\end{matrix} ..1.1......1.1..
5 1 2 3 4 5 4 5 1 2 3 2 3 4 5 1 5 1 2 3 4 3 4 5 1 2 \begin{matrix}1&2&3&4&5\\4&5&1&2&3&\\2&3&4&5&1\\5&1&2&3&4\\3&4&5&1&2\end{matrix} 1425325314314254253153142 1 . . . . . . 1 . . . . . . 1 . 1 . . . . . . 1 . \begin{matrix}1&.&.&.&.&\\.&.&1&.&.&\\.&.&.&.&1&\\.&1&.&.&.&\\.&.&.&1&.&\end{matrix} 1.......1..1.......1..1.. . 1 . . . . . . . 1 . . 1 . . 1 . . . . . . . 1 . \begin{matrix}.&1&.&.&.&\\.&.&.&.&1&\\.&.&1&.&.&\\1&.&.&.&.&\\.&.&.&1&.&\end{matrix} ...1.1......1......1.1...
6 . 1 2 3 4 . 3 . 4 1 . 2 4 2 . . 3 1 1 3 . . 2 4 2 . 1 4 . 3 . 4 3 2 1 . \begin{matrix}.&1&2&3&4&.&\\3&.&4&1&.&2&\\4&2&.&.&3&1&\\1&3&.&.&2&4&\\2&.&1&4&.&3&\\.&4&3&2&1&.&\end{matrix} .3412.1.23.424..1331..424.32.1.2143. . 1 . . . . . . . 1 . . . . . . . 1 1 . . . . . . . 1 . . . . . . . 1 . \begin{matrix}.&1&.&.&.&.&\\.&.&.&1&.&.&\\.&.&.&.&.&1&\\1&.&.&.&.&.&\\.&.&1&.&.&.&\\.&.&.&.&1&.&\end{matrix} ...1..1.........1..1.........1..1...
7 1 2 3 4 5 6 7 6 7 1 2 3 4 5 4 5 6 7 1 2 3 2 3 4 5 6 7 1 7 1 2 3 4 5 6 5 6 7 1 2 3 4 3 4 5 6 7 1 2 \begin{matrix}1&2&3&4&5&6&7&\\6&7&1&2&3&4&5&\\4&5&6&7&1&2&3&\\2&3&4&5&6&7&1&\\7&1&2&3&4&5&6&\\5&6&7&1&2&3&4&\\3&4&5&6&7&1&2\end{matrix} 1642753275316431642754275316531642764275317531642 . . 1 . . . . . . . . . . 1 . 1 . . . . . . . . 1 . . . . . . . . 1 . 1 . . . . . . . . . . 1 . . \begin{matrix}.&.&1&.&.&.&.&\\.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&\\.&.&.&1&.&.&.&\\.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&\\.&.&.&.&1&.&.&\end{matrix} .....1...1....1.........1.........1....1...1..... . . . 1 . . . . . . . . . 1 . . . . 1 . . . 1 . . . . . . . . . . 1 . 1 . . . . . . . . 1 . . . . \begin{matrix}.&.&.&1&.&.&.&\\.&.&.&.&.&.&1&\\.&.&.&.&1&.&.&\\.&1&.&.&.&.&.&\\.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&\\.&.&1&.&.&.&.&\\\end{matrix} .....1....1.........11........1........1...1.....
7 1 2 3 4 5 6 7 5 6 7 1 2 3 4 2 3 4 5 6 7 1 6 7 1 2 3 4 5 3 4 5 6 7 1 2 7 1 2 3 4 5 6 4 5 6 7 1 2 3 \begin{matrix}1&2&3&4&5&6&7&\\5&6&7&1&2&3&4&\\2&3&4&5&6&7&1&\\6&7&1&2&3&4&5&\\3&4&5&6&7&1&2&\\7&1&2&3&4&5&6&\\4&5&6&7&1&2&3\end{matrix} 1526374263741537415264152637526374163741527415263 1 . . . . . . . . . 1 . . . . . . . . . 1 . . 1 . . . . . . . . . 1 . . 1 . . . . . . . . . 1 . . \begin{matrix}1&.&.&.&.&.&.&\\.&.&.&1&.&.&.&\\.&.&.&.&.&.&1&\\.&.&1&.&.&.&.&\\.&.&.&.&.&1&.&\\.&1&.&.&.&.&.&\\.&.&.&.&1&.&.&\end{matrix} 1...........1....1....1...........1....1....1.... . 1 . . . . . . . . . . . 1 . . . . 1 . . . . 1 . . . . 1 . . . . . . . . . . . 1 . . . . 1 . . . \begin{matrix}.&1&.&.&.&.&.&\\.&.&.&.&.&.&1&\\.&.&.&.&1&.&.&\\.&.&1&.&.&.&.&\\1&.&.&.&.&.&.&\\.&.&.&.&.&1&.&\\.&.&.&1&.&.&.&\\\end{matrix} ....1..1.........1.........1..1.........1..1.....
8 1 . 2 3 4 5 . 6 . 4 6 5 2 1 3 . 6 2 . 4 3 . 5 1 5 3 1 . . 6 4 2 2 6 4 . . 3 1 5 3 5 . 1 6 . 2 4 . 1 3 2 5 4 6 . 4 . 5 6 1 2 . 3 \begin{matrix}1&.&2&3&4&5&.&6\\.&4&6&5&2&1&3&.\\6&2&.&4&3&.&5&1\\5&3&1&.&.&6&4&2\\2&6&4&.&.&3&1&5\\3&5&.&1&6&.&2&4\\.&1&3&2&5&4&6&.\\4&.&5&6&1&2&.&3\end{matrix} 1.6523.4.423651.26.14.35354..126423..65151.63.42.354126.6.1254.3 . . . 1 . . . . . . . . . 1 . . . . . . . . . 1 . 1 . . . . . . . . . . . . 1 . 1 . . . . . . . . . 1 . . . . . . . . . 1 . . . \begin{matrix}.&.&.&1&.&.&.&.&\\.&.&.&.&.&1&.&.&\\.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&\\.&.&1&.&.&.&.&.&\\.&.&.&.&1&.&.&.&\\\end{matrix} .....1.....1..........1.1..............1.1..........1.....1..... . 1 . . . . . . . . . 1 . . . . . . . . . 1 . . . . . . . . . 1 . . 1 . . . . . 1 . . . . . . . . . . . . . 1 . . . . . 1 . . . \begin{matrix}.&1&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&\\.&.&.&.&.&1&.&.&\\.&.&.&.&.&.&.&1&\\.&.&1&.&.&.&.&.&\\1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&\\.&.&.&.&1&.&.&.&\\\end{matrix} .....1..1...........1....1.............1..1...........1....1....
8 . 1 2 3 4 5 6 . . 4 6 5 2 1 3 . 6 5 . 4 3 . 2 1 2 3 1 . . 6 4 5 1 . 4 2 5 3 . 6 3 2 . 1 6 . 5 4 5 6 3 . . 4 1 2 4 . 5 6 1 2 . 3 \begin{matrix}.&1&2&3&4&5&6&.\\.&4&6&5&2&1&3&.\\6&5&.&4&3&.&2&1\\2&3&1&.&.&6&4&5\\1&.&4&2&5&3&.&6\\3&2&.&1&6&.&5&4\\5&6&3&.&.&4&1&2\\4&.&5&6&1&2&.&3\end{matrix} ..6213541453.26.26.14.35354.21.6423.56.151.63.426324.51...156423 . . . 1 . . . . . 1 . . . . . . . . . . . . . 1 . . . . 1 . . . . . . . . . 1 . 1 . . . . . . . . . 1 . . . . . . . . . . 1 . . \begin{matrix}.&.&.&1&.&.&.&.&\\.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&\\.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&\\.&.&1&.&.&.&.&.&\\.&.&.&.&.&1&.&.&\\\end{matrix} .....1...1............1.1..........1...........1....1.....1..... 1 . . . . . . . . . . . 1 . . . . . . . . . . 1 . . . . . 1 . . . . 1 . . . . . . . . . . . 1 . . 1 . . . . . . . . . 1 . . . . \begin{matrix}1&.&.&.&.&.&.&.&\\.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&.&1&\\.&.&.&.&.&1&.&.&\\.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&1&.&\\.&1&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&\\\end{matrix} 1.............1.....1..........1.1.........1.........1....1.....
9 . 1 2 3 4 5 6 7 . 5 6 4 . 7 1 3 . 2 1 7 . 2 5 6 . 4 3 2 5 6 4 . 3 1 . 7 6 4 3 . 1 . 7 2 5 3 . 1 7 . 2 5 6 4 7 2 . 5 6 4 . 3 1 4 . 7 1 3 . 2 5 6 . 3 5 6 2 7 4 1 . \begin{matrix}.&1&2&3&4&5&6&7&.\\5&6&4&.&7&1&3&.&2\\1&7&.&2&5&6&.&4&3\\2&5&6&4&.&3&1&.&7\\6&4&3&.&1&.&7&2&5\\3&.&1&7&.&2&5&6&4\\7&2&.&5&6&4&.&3&1\\4&.&7&1&3&.&2&5&6\\.&3&5&6&2&7&4&1&.\end{matrix} .5126374.16754.2.324.631.753.24.7516475.1.6325163.24.763.175.247.4.26351.2375416. . . . 1 . . . . . . . . . . . 1 . . . . . . . . . . 1 . 1 . . . . . . . . . . . 1 . . . . . . . . . . . 1 . 1 . . . . . . . . . . 1 . . . . . . . . . . . 1 . . . \begin{matrix}.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&\\.&.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&.&\\.&.&.&.&1&.&.&.&.&\\.&.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&.&\\.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\\end{matrix} ......1.....1............1.1............1............1.1............1.....1...... . . 1 . . . . . . . . . . . 1 . . . . . . . . . . 1 . 1 . . . . . . . . . . . . 1 . . . . . . . . . . . . 1 . 1 . . . . . . . . . . 1 . . . . . . . . . . . 1 . . \begin{matrix}.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&.&\\.&.&.&.&1&.&.&.&.&\\.&.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&\\\end{matrix} ...1...........1..1...............1.....1.....1...............1..1...........1...
9 . 1 2 3 4 5 6 7 . 6 4 . 5 . 7 1 2 3 7 . . 2 3 4 5 6 1 5 . 7 . 6 1 2 3 4 3 6 1 . 7 . 4 5 2 1 2 3 4 5 . 7 . 6 4 5 6 1 2 3 . . 7 2 3 4 7 . 6 . 1 5 . 7 5 6 1 2 3 4 . \begin{matrix}.&1&2&3&4&5&6&7&.\\6&4&.&5&.&7&1&2&3\\7&.&.&2&3&4&5&6&1\\5&.&7&.&6&1&2&3&4\\3&6&1&.&7&.&4&5&2\\1&2&3&4&5&.&7&.&6\\4&5&6&1&2&3&.&.&7\\2&3&4&7&.&6&.&1&5\\.&7&5&6&1&2&3&4&.\end{matrix} .6753142.14..625372..713645352..41764.36752.15741..362615247..372635..14.3142675. . 1 . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . . . . 1 . . . . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . 1 . \begin{matrix}.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&\\.&.&.&.&1&.&.&.&.&\\.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&\\.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&\\\end{matrix} ..1......1.............1..........1.....1.....1..........1.............1......1.. . 1 . . . . . . . . . . 1 . . . . . . . . . . . . . 1 . . . . . . 1 . . . . . . 1 . . . . . . 1 . . . . . . 1 . . . . . . . . . . . . . 1 . . . . . . . . . . 1 . \begin{matrix}.&1&.&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&\\.&.&.&.&.&.&1&.&.&\\.&.&.&.&1&.&.&.&.&\\.&.&1&.&.&.&.&.&.&\\1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&.&1&.&\\\end{matrix} ......1..1.............1....1...........1...........1....1.............1..1......
9 . 1 2 3 4 5 6 . 7 6 . 5 7 1 2 3 4 . 7 4 3 . . 6 5 1 2 1 6 . 5 7 . 2 3 4 5 3 . 2 6 4 . 7 1 2 7 4 . 3 1 . 6 5 4 5 1 6 . . 7 2 3 . 2 7 4 5 3 1 . 6 3 . 6 1 2 7 4 5 . \begin{matrix}.&1&2&3&4&5&6&.&7\\6&.&5&7&1&2&3&4&.\\7&4&3&.&.&6&5&1&2\\1&6&.&5&7&.&2&3&4\\5&3&.&2&6&4&.&7&1\\2&7&4&.&3&1&.&6&5\\4&5&1&6&.&.&7&2&3\\.&2&7&4&5&3&1&.&6\\3&.&6&1&2&7&4&5&.\end{matrix} .671524.31.463752.253..417637.52.64141.763.52526.41.376352..714.413762.57.241536. 1 . . . . . . . . . . . 1 . . . . . . . . . . 1 . . . . . 1 . . . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . . . 1 . . . . . 1 . . . . . . . . . . 1 . . \begin{matrix}1&.&.&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&\\.&.&.&.&1&.&.&.&.&\\.&.&.&.&.&.&1&.&.&\\\end{matrix} 1.............1......1......1..............1...1..............1......1......1.... 1 . . . . . . . . . . . . . 1 . . . . . . . . . . 1 . . . . . 1 . . . . . 1 . . . . . . . . . . 1 . . . . . . . . . . . . . 1 . . . . . . 1 . . . . 1 . . . . . . \begin{matrix}1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&.&1&.&\\.&.&.&.&1&.&.&.&.&\\.&1&.&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&\\.&.&.&.&.&.&1&.&.&\\.&.&1&.&.&.&.&.&.&\\\end{matrix} 1............1............1.....1......1......1..............1...1............1..
10 1 2 . 3 4 5 6 . 7 8 3 . 7 5 8 1 4 2 . 6 . 5 6 1 7 2 8 3 4 . 6 7 4 8 . . 1 5 2 3 8 3 2 . 5 4 . 7 6 1 2 4 8 . 6 3 . 1 5 7 5 1 3 2 . . 7 6 8 4 . 6 5 7 1 8 2 4 3 . 4 . 1 6 2 7 3 8 . 5 7 8 . 4 3 6 5 . 1 2 \begin{matrix}1&2&.&3&4&5&6&.&7&8\\3&.&7&5&8&1&4&2&.&6\\.&5&6&1&7&2&8&3&4&.\\6&7&4&8&.&.&1&5&2&3\\8&3&2&.&5&4&.&7&6&1\\2&4&8&.&6&3&.&1&5&7\\5&1&3&2&.&.&7&6&8&4\\.&6&5&7&1&8&2&4&3&.\\4&.&1&6&2&7&3&8&.&5\\7&8&.&4&3&6&5&.&1&2\end{matrix} 13.6825.472.573416.8.76428351.3518..2764487.56.123512.43.8766481..7235.23571648.7.426583.186.3174.52 . . 1 . . . . . . . . . . . . 1 . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . 1 . . . . . . . . . . . . 1 . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . 1 . . . . . . . . . . . . 1 . . \begin{matrix}.&.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&.&\\.&.&.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&.&.&\\.&.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&.&\\.&.&.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&.&.&\\.&.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&.&\\\end{matrix} ...1.............1..1.............1.............1..1.............1.............1..1.............1... . . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . . \begin{matrix}.&.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&1&\\.&.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&.&\\.&.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&.&\\.&1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&.&\\1&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&.&\\\end{matrix} ........1.......1.......1.......1.......1..................1.......1.......1.......1.......1........
10 . 1 2 3 4 5 6 7 8 . 5 . 6 1 7 2 8 3 . 4 3 7 . 4 8 1 5 . 2 6 2 5 8 . 3 6 . 1 4 7 8 6 4 2 . . 7 5 3 1 1 3 5 7 . . 2 4 6 8 7 4 1 . 6 3 . 8 5 2 6 2 . 5 1 8 4 . 7 3 4 . 3 8 2 7 1 6 . 5 . 8 7 6 5 4 3 2 1 . \begin{matrix}.&1&2&3&4&5&6&7&8&.\\5&.&6&1&7&2&8&3&.&4\\3&7&.&4&8&1&5&.&2&6\\2&5&8&.&3&6&.&1&4&7\\8&6&4&2&.&.&7&5&3&1\\1&3&5&7&.&.&2&4&6&8\\7&4&1&.&6&3&.&8&5&2\\6&2&.&5&1&8&4&.&7&3\\4&.&3&8&2&7&1&6&.&5\\.&8&7&6&5&4&3&2&1&.\end{matrix} .53281764.1.756342.826.8451.37314.27.5864783..61255216..3874685.72.41373.1548.628.243657.1.46718235. . . . 1 . . . . . . . . . . . . . 1 . . . . . . 1 . . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . . . . . . . 1 . 1 . . . . . . . . . . . . . 1 . . . . . . 1 . . . . . . . . . . . . . 1 . . . \begin{matrix}.&.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&.&\\.&.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&.&\\1&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&1&\\.&1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&.&\\.&.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&.&\\\end{matrix} ....1...........1...........1.1...........1..............1...........1.1...........1...........1....
11 1 2 3 4 5 6 7 8 9 a b a b 1 2 3 4 5 6 7 8 9 8 9 a b 1 2 3 4 5 6 7 6 7 8 9 a b 1 2 3 4 5 4 5 6 7 8 9 a b 1 2 3 2 3 4 5 6 7 8 9 a b 1 b 1 2 3 4 5 6 7 8 9 a 9 a b 1 2 3 4 5 6 7 8 7 8 9 a b 1 2 3 4 5 6 5 6 7 8 9 a b 1 2 3 4 3 4 5 6 7 8 9 a b 1 2 \begin{matrix}1&2&3&4&5&6&7&8&9&a&b\\a&b&1&2&3&4&5&6&7&8&9\\8&9&a&b&1&2&3&4&5&6&7\\6&7&8&9&a&b&1&2&3&4&5\\4&5&6&7&8&9&a&b&1&2&3\\2&3&4&5&6&7&8&9&a&b&1\\b&1&2&3&4&5&6&7&8&9&a\\9&a&b&1&2&3&4&5&6&7&8\\7&8&9&a&b&1&2&3&4&5&6\\5&6&7&8&9&a&b&1&2&3&4\\3&4&5&6&7&8&9&a&b&1&2\end{matrix} 1a8642b97532b97531a86431a8642b97542b97531a86531a8642b97642b97531a87531a8642b98642b97531a97531a8642ba8642b97531b97531a8642 . . . . 1 . . . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . 1 . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . . . 1 . . . . \begin{matrix}.&.&.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&.&1&\\.&.&.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&1&.&\\.&.&1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&.&.&\\.&1&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&.&.&\\1&.&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&.&.&\\\end{matrix} .........1........1.......1........1........1...............1...............1........1........1.......1........1......... . . . . 1 . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . . . . . . 1 . . . 1 . . . . . . . . . . . . . 1 . . . . \begin{matrix}.&.&.&.&1&.&.&.&.&.&.&\\.&.&.&.&.&.&.&1&.&.&.&\\1&.&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&1&.&.&\\.&1&.&.&.&.&.&.&.&.&.&\\.&.&.&.&.&1&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&1&.&\\.&.&1&.&.&.&.&.&.&.&.&\\.&.&.&.&.&.&.&.&.&.&1&\\.&.&.&1&.&.&.&.&.&.&.&\\.&.&.&.&.&.&1&.&.&.&.&\\\end{matrix} ..1............1.............1............1.1...............1...............1.1............1.............1............1..

扩展N皇后的搜索方式还是回溯法:
1.先找出第一组N皇后的解
2.在第一组解的基础上,再找出第二组N皇后的解。依此方式迭代,直到找出G组N皇后。
3.如果找不到第G+1组,则寻找下一个第G组。
4.如果所有的G组都遍历完了,再遍历所有的G-1组,直到所有的第一组N皇后全部遍历完成。

上述的搜索空间仍然非常巨大,在N=8时的搜索结果就需要几十分钟。因此要考虑剪枝:
a.保持顺序,要求第一行的所有组数都是单调递增的,非递增的全部删除。
b.对称性,在未剪枝前的搜索结果中,存在大量中心对称和轴对称的图案,其中存在两个组互为中心对称图案或轴对称,或者本身就是中心对称图案。因此可以在搜索出一组解之后,将其进行对称变换,得到3组新的N皇后,再进行验证。
下面是解决本次问题中使用过的代码,可以快速搜索出扩展N皇后的对称解:

package main

import (
	"fmt"
)

const (
	Undefined = 1000
	MaxSize   = 25
)

var (
	board [MaxSize][MaxSize]int
	count int
)

func main() {
	SolveNqueue(4, 2)
	SolveNqueue(5, 5)
	SolveNqueue(6, 4)
	SolveNqueue(7, 7)
	SolveNqueue(8, 6)
	SolveNqueue(9, 7)
	SolveNqueue(10, 8)
	fmt.Println("exit")
}

func CleanHigher(N, lowerBound int) {
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] > lowerBound {
				board[i][j] = Undefined
			}
		}
	}
}

func Show(N int) {
	characters := map[int]int{}
	for i := 0; i < N; i++ {
		if board[0][i] < Undefined {
			characters[board[0][i]] = len(characters) + 1
		}
	}

	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] < Undefined {
				fmt.Printf("%x ", characters[board[i][j]])
			} else {
				fmt.Print("- ")
			}
		}
		fmt.Println()
	}
	fmt.Println()
}

func SolveNqueue(N, G int) {
	CleanHigher(N, -1)
	count = 0
	NQueueStep2(N, 0, G, 1)
}

func NQueueStep(N, row, G, group int) {
	if row < N {
		begin := 0
		if row == 0 {
			// 设置开始位置,要求第一行的组号是递增的
			for i := 0; i < N; i++ {
				if board[0][i]%4 == 1 {
					begin = i + 1
				}
			}
		}
		for i := begin; i < N; i++ {
			if board[row][i] < group {
				continue
			}
			board[row][i] = group

			// 检查是否会攻击到同一组的皇后
			for k := 1; k <= row; k++ {
				if board[row-k][i] == group ||
					(i+k < N && board[row-k][i+k] == group) ||
					(i-k >= 0 && board[row-k][i-k] == group) {
					goto Next
				}
			}
			NQueueStep(N, row+1, G, group)
		Next:
			board[row][i] = Undefined
		}
		return
	}

	// 判断是否可以放入180度中心对称的组
	allEmpty := true
	allSame := true
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] == group {
				if board[N-1-i][N-1-j] != Undefined {
					allEmpty = false
				}
				if board[N-1-i][N-1-j] != group {
					allSame = false
				}
				if !allEmpty && !allSame {
					return
				}
			}
		}
	}
	if allEmpty {
		for i := 0; i < N; i++ {
			for j := 0; j < N; j++ {
				if board[i][j] == group {
					board[N-1-i][N-1-j] = group + 1
				}
			}
		}
	}

	// 判断是否可以放置上下对称的组
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] == group {
				if board[N-1-i][j] != Undefined {
					goto SET2
				}
			}
		}
	}
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] == group {
				board[N-1-i][j] = group + 2
			}
		}
	}
SET2:

	// 判断是否可以放置左右对称的组
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] == group {
				if board[i][N-1-j] != Undefined {
					goto SET3
				}
			}
		}
	}
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if board[i][j] == group {
				board[i][N-1-j] = group + 3
			}
		}
	}
SET3:

	for i := 0; i < N; i++ {
		if board[0][i] == Undefined {
		} else if board[0][i] == group {
			break
		} else if board[0][i] > group {
			CleanHigher(N, group)
			return
		}
	}

	group_count := 0
	for i := 0; i < N; i++ {
		if board[0][i] != Undefined {
			group_count++
		}
	}

	if group_count < G {
		NQueueStep(N, 0, G, group+4)
	} else {
		count++
		fmt.Printf("N=%d, count=%d\n", N, count)
		Show(N)
	}
	CleanHigher(N, group)
	return
}

目前已知有规律的扩展N皇后的解如下:
在4~30的范围内(8,9,14,15,20,21,24,26,27)的解暂时没有找到规律

package main

import (
	"fmt"
)

const Max = 50

func checkN(N int, des [Max][Max]int) {
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			for k := 1; k <= i; k++ {
				if des[i][j] == 0 {
					continue
				}
				if des[i][j] == des[i-k][j] {
					fmt.Println("exit at0", i, j, des[i][j])
					return
				}
				if j-k >= 0 && des[i][j] == des[i-k][j-k] {
					fmt.Println("exit ata", i, j, des[i][j])
					return
				}
				if j+k < N && des[i][j] == des[i-k][j+k] {
					fmt.Println("exit atb", i, j, des[i][j])
					return
				}
			}
		}
	}
	fmt.Println("pass", N)
}

func NQueue(N int) (des [Max][Max]int) {
	switch N {
	case 5, 7, 11, 13, 17, 19, 23, 29, 31, 37:
		// N is prime
		for i := 0; i < N; i++ {
			for g := 1; g <= N; g++ {
				des[i][(2*i+g-1)%N] = g
			}
		}
	case 4, 6, 10, 12, 16, 18, 22, 28, 30, 36:
		// N + 1 is prime
		for i := 0; i < N; i++ {
			for g := 1; g <= N-2; g++ {
				des[i][((g+1)*(i+1)-1)%(N+1)] = g
			}
		}
	case 25, 35, 49:
		// N is prime * prime, where all the prime > 3
		p1 := 5
		if N == 49 {
			p1 = 7
		}
		tmp1 := NQueue(p1)
		tmp2 := NQueue(N / p1)
		for i := 0; i < N; i++ {
			for j := 0; j < N; j++ {
				des[i][j] = (tmp2[i/p1][j/p1]-1)*p1 + tmp1[i%p1][j%p1]
			}
		}
	case 8:
		des = [Max][Max]int{
			{1, 0, 2, 3, 4, 5, 0, 6},
			{0, 4, 6, 5, 2, 1, 3, 0},
			{6, 2, 0, 4, 3, 0, 5, 1},
			{5, 3, 1, 0, 0, 6, 4, 2},
			{2, 6, 4, 0, 0, 3, 1, 5},
			{3, 5, 0, 1, 6, 0, 2, 4},
			{0, 1, 3, 2, 5, 4, 6, 0},
			{4, 0, 5, 6, 1, 2, 0, 3},
		}
	case 9:
		des = [Max][Max]int{
			{0, 1, 2, 3, 4, 5, 6, 0, 7},
			{6, 0, 5, 7, 1, 2, 3, 4, 0},
			{7, 4, 3, 0, 0, 6, 5, 1, 2},
			{1, 6, 0, 5, 7, 0, 2, 3, 4},
			{5, 3, 0, 2, 6, 4, 0, 7, 1},
			{2, 7, 4, 0, 3, 1, 0, 6, 5},
			{4, 5, 1, 6, 0, 0, 7, 2, 3},
			{0, 2, 7, 4, 5, 3, 1, 0, 6},
			{3, 0, 6, 1, 2, 7, 4, 5, 0},
		}
	case 14:
		des = [Max][Max]int{
			{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0},
			{8, 0, 4, 11, 1, 7, 3, 10, 6, 12, 2, 9, 0, 5},
			{3, 6, 0, 9, 5, 12, 11, 2, 1, 8, 4, 0, 7, 10},
			{2, 12, 7, 0, 8, 9, 10, 3, 4, 5, 0, 6, 1, 11},
			{6, 8, 10, 1, 0, 11, 4, 9, 2, 0, 12, 3, 5, 7},
			{10, 9, 11, 7, 12, 0, 5, 8, 0, 1, 6, 2, 4, 3},
			{4, 2, 12, 5, 6, 10, 0, 0, 3, 7, 8, 1, 11, 9},
			{9, 5, 3, 2, 7, 1, 0, 0, 12, 6, 11, 10, 8, 4},
			{1, 4, 8, 6, 3, 0, 2, 11, 0, 10, 7, 5, 9, 12},
			{7, 11, 1, 10, 0, 8, 9, 4, 5, 0, 3, 12, 2, 6},
			{5, 3, 6, 0, 11, 4, 1, 12, 9, 2, 0, 7, 10, 8},
			{12, 7, 0, 4, 2, 3, 8, 5, 10, 11, 9, 0, 6, 1},
			{11, 0, 9, 8, 10, 6, 12, 1, 7, 3, 5, 4, 0, 2},
			{0, 10, 5, 12, 9, 2, 7, 6, 11, 4, 1, 8, 3, 0},
		}
	case 15:
		des = [Max][Max]int{
			{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13},
			{10, 7, 1, 2, 3, 8, 12, 13, 11, 6, 4, 5, 9, 0, 0},
			{2, 6, 9, 11, 1, 7, 4, 3, 12, 5, 10, 13, 0, 8, 0},
			{12, 13, 8, 0, 0, 11, 1, 2, 10, 3, 7, 4, 6, 9, 5},
			{11, 10, 6, 0, 12, 9, 13, 0, 7, 8, 2, 1, 5, 3, 4},
			{7, 12, 4, 10, 13, 5, 3, 9, 0, 1, 0, 6, 2, 11, 8},
			{9, 3, 5, 7, 4, 2, 8, 6, 0, 0, 12, 11, 10, 13, 1},
			{6, 8, 2, 1, 11, 0, 5, 10, 13, 0, 9, 3, 7, 4, 12},
			{3, 5, 10, 9, 6, 0, 0, 12, 4, 7, 8, 2, 13, 1, 11},
			{4, 9, 7, 12, 0, 3, 0, 11, 1, 13, 5, 10, 8, 6, 2},
			{8, 1, 13, 3, 7, 4, 2, 0, 5, 11, 6, 0, 12, 10, 9},
			{13, 11, 12, 8, 2, 1, 10, 7, 3, 9, 0, 0, 4, 5, 6},
			{0, 4, 0, 5, 10, 13, 6, 1, 8, 2, 3, 9, 11, 12, 7},
			{0, 0, 11, 13, 8, 12, 9, 5, 6, 4, 1, 7, 3, 2, 10},
			{5, 0, 0, 6, 9, 10, 11, 4, 2, 12, 13, 8, 1, 7, 3},
		}
	case 20:
		des = [Max][Max]int{
			{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 0},
			{16, 0, 12, 10, 17, 13, 8, 1, 14, 15, 4, 5, 18, 11, 6, 2, 9, 7, 0, 3},
			{18, 8, 0, 15, 7, 6, 5, 10, 2, 16, 3, 17, 9, 14, 13, 12, 4, 0, 11, 1},
			{15, 13, 3, 0, 14, 9, 11, 17, 18, 7, 12, 1, 2, 8, 10, 5, 0, 16, 6, 4},
			{17, 4, 9, 5, 0, 18, 16, 12, 6, 11, 8, 13, 7, 3, 1, 0, 14, 10, 15, 2},
			{14, 10, 11, 7, 2, 0, 13, 18, 15, 3, 16, 4, 1, 6, 0, 17, 12, 8, 9, 5},
			{11, 12, 14, 6, 1, 10, 0, 16, 17, 4, 15, 2, 3, 0, 9, 18, 13, 5, 7, 8},
			{9, 16, 13, 4, 8, 2, 1, 0, 7, 5, 14, 12, 0, 18, 17, 11, 15, 6, 3, 10},
			{12, 5, 18, 2, 11, 3, 4, 9, 0, 6, 13, 0, 10, 15, 16, 8, 17, 1, 14, 7},
			{7, 3, 1, 9, 6, 15, 17, 14, 11, 0, 0, 8, 5, 2, 4, 13, 10, 18, 16, 12},
			{13, 17, 15, 8, 12, 1, 3, 5, 10, 0, 0, 9, 14, 16, 18, 7, 11, 4, 2, 6},
			{6, 14, 4, 16, 10, 17, 18, 8, 0, 12, 7, 0, 11, 1, 2, 9, 3, 15, 5, 13},
			{8, 2, 7, 18, 9, 16, 15, 0, 13, 14, 5, 6, 0, 4, 3, 10, 1, 12, 17, 11},
			{10, 6, 5, 12, 15, 11, 0, 2, 3, 18, 1, 16, 17, 0, 8, 4, 7, 14, 13, 9},
			{5, 11, 10, 13, 16, 0, 7, 4, 1, 17, 2, 18, 15, 12, 0, 3, 6, 9, 8, 14},
			{3, 18, 8, 14, 0, 4, 2, 6, 12, 10, 9, 7, 13, 17, 15, 0, 5, 11, 1, 16},
			{1, 7, 17, 0, 5, 8, 10, 3, 4, 13, 6, 15, 16, 9, 11, 14, 0, 2, 12, 18},
			{4, 9, 0, 1, 13, 12, 14, 11, 16, 2, 17, 3, 8, 5, 7, 6, 18, 0, 10, 15},
			{2, 0, 6, 11, 3, 7, 9, 15, 5, 1, 18, 14, 4, 10, 12, 16, 8, 13, 0, 17},
			{0, 15, 16, 17, 18, 14, 12, 13, 9, 8, 11, 10, 6, 7, 5, 1, 2, 3, 4, 0},
		}
	}

	fmt.Println(N)
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			if 10 <= des[i][j] {
				fmt.Printf("%c ", des[i][j]-10+'a')
			} else if 1 <= des[i][j] {
				fmt.Printf("%d ", des[i][j])
			} else {
				fmt.Printf("- ")
			}
		}
		fmt.Println()
	}
	return des
}

func main() {
	for i := 4; i <= 20; i++ {
		des := NQueue(i)
		checkN(i, des)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值