算法之八皇后问题的解决方法

python基础

浏览数:824

2019-7-25

问题描述: 在国际象棋棋盘上,棋盘是8*8的,皇后可以吃掉其同一行列以及斜线方向的棋子,在这张棋盘上可以有多少种8个皇后的摆放方法,能够让各个皇后都不能吃掉其他皇后。

求解思路:回溯与递归算法 python

  1.确定并调试检测函数,检测函数的作用是检查当前加入的新皇后是否符合要求

1 def check(quene_list ,listnum):
2     for i in range(listnum):
3         if abs(quene_list[listnum]-quene_list[i]) == listnum - i or quene_list[listnum] == quene_list[i]:
4          # 当条件成立时说明新加入的皇后会被攻击到
5             return 0
6     return 1

  2.递归回溯   判断终止条件是当计算到最后一列时,首先确定第n列加入棋盘不会产生冲突,在第n+1列加入皇后,若不冲突则递归计算下一个。在思想上有点像数学归纳法。

 1 def quene(quene_list, listnum, num):
 2     global solve_num
 3     if listnum == num:
 4         solve_num = solve_num + 1
 5         print(quene_list)
 6         return 1
 7     else:
 8         for i in range(num):
 9             quene_list[listnum] = i
10             if check(quene_list, listnum):
11                 quene(quene_list,listnum+1,num)

  3.用python实现八皇后问题的完整代码


 1 # -*- coding: utf-8 -*-
 2 #   八皇后问题的求解,递归回溯问题
 3 
 4 import math
 5 
 6 solve_num = 0
 7 
 8 def check(quene_list ,listnum):
 9     for i in range(listnum):
10         if abs(quene_list[listnum]-quene_list[i]) == listnum - i or quene_list[listnum] == quene_list[i]:
11          # 当条件成立时说明新加入的皇后会被攻击到
12             return 0
13     return 1
14 
15 def quene(quene_list, listnum, num):
16     global solve_num
17     if listnum == num:
18         solve_num = solve_num + 1
19         print(quene_list)
20         return 1
21     else:
22         for i in range(num):
23             quene_list[listnum] = i
24             if check(quene_list, listnum):
25                 quene(quene_list,listnum+1,num)
26 
27 if __name__ == "__main__":
28     quene_list = [0, 0, 0, 0, 0, 0, 0, 0,0]
29     num = 9
30     quene(quene_list,0, 8)
31     print(solve_num)

 

作者:全部都烧起来~