从大一开始学C以来,看了不少经典的变成题目,却单单没有看到关于8皇后的题目,杯具!!!
这一段时间开始学习linux c和python,在看python书籍的时候,突然看到了这么一道8皇后的题目,兴趣来了。
也不知道是自己的水平下降还是确实对于国际象棋不够了解,居然在理解题意的时候就出现了问题,下面,先将题目打印 出来:
题目:
在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”现象,即不能有两个皇后处于同一行,同一列或同一对角线上,问共有多少中不同的方法。
i(0-7)
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
j(0-7) 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
正对角线:我们将和符号 ‘ / ’一个方向的称为正对角线。 特性: 对角上i+j值相同 ,范围在0-14
反对角线:于‘ / ’方向相同的称为反对角线。 特性:对角上 i-j 的值相同 , 范围在-7~0~7, 我们用i-j+7将 范围变为 0- 14
根据条件,同一行,同一列或同一对角线不能有两个皇后,
我们选择行 row 来存放在该行中,皇后应该在的列位置。如row [2, 4, 5, 1 , ……],意思是在第0行第2列有一个皇后,在第1行第4列有一个皇后。
使用col 来存放表示该列是否有皇后, 1表示没有, 0表示有
用pos_dig来存放正对角是否有皇后, pos_dig = [1, 1, 1, 1, 1, 1, 1, 1, ……] 0-14
用nag_dig来存放反对角是否有皇后, nag_dig = [1, 1, 1, 1, 1, 1, 1, 1,…… ] 0-14
程序过程:
声明 row, col , nag_dig , pos_dig, count
初始化
从第0行开始递归:
第0列从第0行开始分别于0到7行进行对比,判断皇后位置, 到第7行时开始输出row, count+1, 将col,nag_dig, pos_dig回归初始状态
第1列从第0行开始分别于0到7行进行对比,判断皇后位置, 到第7行时开始输出row, count+1, 将col,nag_dig, pos_dig回归初始状态
……
输出count
python代码如下: