八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。
来提取一下重要信息,任意两个皇后,
- 不能处于同一行。
- 同一列。
- 同一斜线上。
不能处于同一行,跟同一列只需要让,一行里只有一个棋子,一列里,只有一个棋子就好,斜线如何处理呢?假设n是当前皇后,i是对比的皇后,如果n-i的绝对值等于n皇后的列数-i皇后的列数的绝对值这样n皇后跟i皇后就处于同一斜线上。(网上抄的)(其实就是n皇后跟i皇后之间相差的行数和列数不能相等,相等的话就是一个等腰直角三角形,必定处于同一直线)
使用一维数组也可以实现二维数组的效果:
checkerboard[i]={val,val,...}; i表示行 val表示列
至于是如何回溯的,可以自己debug看看,数组快成{0 , 4, 7, 5, 2, 6, 1, 3},慢慢看。
代码如下: