本解法的思路是先使用 np.zeros((8,8),dtype=int) 生成8*8的二维数组,每行放一个皇后,放上皇后的位置值为1,否则为0。使用8个for循环来依次对每一行的皇后进行控制,在循环的过程中进行判断:如果该行皇后的位置与上一行的皇后的位置不在同一列,且不在其左下方或右下方,则进行下一行的循环,否则跳过这次循环。当循环进行到最里层时,判断所有的皇后中是否有皇后在同一列、是否在同一斜线。


定义判断函数

在这里我们定义两个函数,一个判断各个皇后是否处于同一列,一个判断是否在同一斜线。八行皇后的横坐标分别为i,j,k,l,m,n,o,p。下面是判断是否在同一列的函数:

def check_column(i, j, k, l, m, n, o, p):if (i != k) & (i != l) & (i != m) & (i != n) & (i != o) & (i != p) & (j != l) & (j != m) & (j != n) & (j != o) & (j != p) & (k != m) & (k != n) & (k != o) & (k != p) & (l != n) & (l != o) & (l != p) & (m != o) & (m != p) & (n != p):return 1

你可能会发现好像少了几个判断,这里的判断都是跨行的,相邻行的判断写在循环里。下面是判断是否在同一斜线的函数:

def check_diagonal_line(i, j, k, l, m, n, o, p):if (abs(i - k) != 2) & (abs(i - l) != 3) & (abs(i - m) != 4) & (abs(i - n) != 5) &(abs(i - o) != 6) & (abs(i - p) != 7) & (abs(j - l) != 2) & (abs(j - m) != 3) & (abs(j - n) != 4) & (abs(j - o) != 5) & (abs(j - p) != 6) & (abs(k - m) != 2) & (abs(k - n) != 3) & (abs(k - o) != 4) & (abs(k - p) != 5) & (abs(l - n) != 2) & (abs(l - o) != 3) & (abs(l - p) != 4) & (abs(m - o) != 2) & (abs(m - p) != 3) & (abs(n - p) != 2):return 1

完整代码

import numpy as np
from time import *q = 0  # 统计共有多少种情况
x = np.zeros((8,8),dtype=int)
start = time()def check_column(i, j, k, l, m, n, o, p):if (i != k) & (i != l) & (i != m) & (i != n) & (i != o) & (i != p) & (j != l) & (j != m) & (j != n) & (j != o) & (j != p) & (k != m) & (k != n) & (k != o) & (k != p) & (l != n) & (l != o) & (l != p) & (m != o) & (m != p) & (n != p):return 1def check_diagonal_line(i, j, k, l, m, n, o, p):if (abs(i - k) != 2) & (abs(i - l) != 3) & (abs(i - m) != 4) & (abs(i - n) != 5) & (abs(i - o) != 6) & (abs(i - p) != 7) & (abs(j - l) != 2) & (abs(j - m) != 3) & (abs(j - n) != 4) & (abs(j - o) != 5) & (abs(j - p) != 6) & (abs(k - m) != 2) & (abs(k - n) != 3) & (abs(k - o) != 4) & (abs(k - p) != 5) & (abs(l - n) != 2) & (abs(l - o) != 3) & (abs(l - p) != 4) & (abs(m - o) != 2) & (abs(m - p) != 3) & (abs(n - p) != 2):return 1for i in range(8):  # 第1行if x[0][i-1] == 1:x[0][i-1] = 0x[0][i]=1for j in range(8):  # 第2行if x[1][j-1] == 1:x[1][j-1] = 0x[1][j]=1if (i!=j) & (abs(i-j)>1):for k in range(8):  # 3333if x[2][k-1] == 1:x[2][k-1] = 0x[2][k]=1if (k!=j) & (abs(k - j) > 1):for l in range(8):  # 4444if x[3][l-1]==1:x[3][l-1]=0x[3][l]=1if (k!=l) & (abs(k - l) > 1):for m in range(8):  # 5555if x[4][m-1] == 1:x[4][m-1] = 0x[4][m] = 1if (l!= m) & (abs(l - m) > 1):for n in range(8):  # 6666if x[5][n-1] == 1:x[5][n-1] = 0x[5][n] = 1if (m!= n) & (abs(m - n) > 1):for o in range(8):  # 7777if x[6][o-1] == 1:x[6][o-1] = 0x[6][o] = 1if (n!= o) & (abs(n - o) > 1):for p in range(8):  # 8888if x[7][p-1] == 1:x[7][p-1] = 0x[7][p] = 1if (o!= p) & (abs(o - p) > 1):if check_column(i, j, k, l, m, n, o, p):if check_diagonal_line(i, j, k, l, m, n, o, p):q = q + 1print(x, q)end = time()
print('Running time: %s Seconds'%(end-start))

其中time()函数用来查看整个循环共用多长时间。下面是部分运行结果:

[[0 0 0 0 0 0 0 1][0 0 0 1 0 0 0 0][1 0 0 0 0 0 0 0][0 0 1 0 0 0 0 0][0 0 0 0 0 1 0 0][0 1 0 0 0 0 0 0][0 0 0 0 0 0 1 0][0 0 0 0 1 0 0 0]] 92
Running time: 4.383800745010376 Seconds

共有92种符合条件的结果。

Python 八皇后问题(Eight queens)的简单解法相关推荐

  1. 带你轻而易举的学习python——八皇后问题

    首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...

  2. 八皇后问题详解(四种解法)

    所有源码都在github上(https://github.com/seasonyao/eight_queen_question) 如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问 ...

  3. 关于python的八皇后问题递归算法详解

    这里是对于周一课上的老师教学的python八皇后问题的个人学习记录 八皇后问题出自国际象棋:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不 ...

  4. 八皇后问题python_python八皇后问题的解决方法

    本文为大家分享了python八皇后问题的解决方法,供大家参考,具体内容如下 题目: 给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上.竖线上.斜线上.一般我 ...

  5. 分治回溯算法----八皇后问题

    八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法.如图所示:即八皇后问题的一个解. //分治回溯算法解决八皇后问题 public ...

  6. python遗传算法八皇后_遗传算法之:八皇后问题

    八皇后问题: 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.正确的解有很多个,遗传算法并不直接计算一共有多少个解,而是寻找满 ...

  7. 爬山法实现 八皇后问题 (Python 实现)

    本文主要简单阐述爬山法的基本算法思想,并给出用此算法实现八皇后问题详细过程 最基本的爬上搜索算法表示:(节选自<人工智能>第二版): function HILL-CLIMBING(prob ...

  8. 八皇后问题的进化(4)-python写的八皇后

    这是"Beginning Python From Novice to Professional"里用python写的八皇后,代码量很少,用到了生成器. python一直给我的感觉是 ...

  9. Eight Queens(八皇后)

    八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例. 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个 ...

最新文章

  1. vue+vuex+leaflet Jest单测踩坑指南
  2. Django中的Cookie--实现登录
  3. docker安装nexus3命令
  4. pip 删除安装包_Python中PIP的快速指南
  5. C++中int *p[4]和 int (*q)[4]的区别
  6. 声明为数组定义为指针,声明为指针定义为数组
  7. 【离散数学】二元关系的闭包
  8. 互联网职场红利真的不多了~
  9. CodeBlock13.12对gcc与g++的更新
  10. matlab奈奎斯特图画法,振荡环节 奈奎斯特图和波特图的绘制
  11. 论结果与过程的重要性
  12. 大学英语综合教程一 Unit 1 课文内容英译中 中英翻译
  13. python数组分成两个和相等的子集_javascript,_动态规划——把一个整数数组分成两个和相等的子集,怎么写,javascript - phpStudy...
  14. 【allegro 17.4软件操作保姆级教程八】布线操作基础之三
  15. postgre基本用法(一)
  16. nginx配置文件nginx.conf详细讲解(3)
  17. C++ 网络编程学习指南
  18. babylonjs使用笔记
  19. 惠普台式机安装win7和Ubuntu双系统
  20. 辐射发射测试软件,如何进行电子设备的辐射发射测试

热门文章

  1. 汇千网-未来PC长这样?微软正式推出第一台云电脑
  2. C++设计:关于CMatrix类的相关操作
  3. timedelta 转换为int格式
  4. outlook 找不到电子邮件服务器,使用Outlook收取电子邮件并保留邮箱服务器中的邮件的设置方法...
  5. Input输入框的验证
  6. Jsoup 爬取真气网排名信息
  7. 如何做一名优秀的助教@助教的那些事(助教总结)
  8. 设置Visual Studio颜色主题
  9. JAVA 表格文件简介和解析
  10. 零基础怎么学Python?要学多久?