关于国际象棋皇后的递归问题——经典为8皇后

来源:互联网 发布:网络音乐版权侵权案例 编辑:程序博客网 时间:2024/05/16 05:33

从大一开始学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代码如下:

原创粉丝点击