一般说到八皇后问题,最先想到的就是回溯思想,而回溯思想往往是需要递归来实现的。

计算机很善长做重复的事情,所以递归正和它的胃口,而我们人脑更喜观平铺直叙的思维方式。当

我们看到递归时,总想把递归平铺展开,脑子里就会循环,一层一层往下调,然后再一层一层返回

试图想搞清楚计算机每一步都是怎么执行的,这样就很容易被绕进去。

我就是一个例子,当用递归解决归并或快速排序时,由于问题本身不是很复杂,递归代码还是比较简单能写出来的

但八皇后,我在网上看了相应的代码,总感觉还是似懂非懂,很容易就被绕了进去。

所以我尝试用穷举的方法解决八皇后的问题,

思路如下

  • 穷举每一种摆法
  • 对每一种摆法,转换成nunpy array
  • 分别判断每一行,每一列,每个左下对角线,每个右下对角线是否满足需要

直接看代码:

import numpy as np
import itertools BOARD_SIZE = 8
result = [0] * BOARD_SIZE # 下标表示行,值表示列 # 将tuple 比如 (2,0,1) 转成numpy array:
#array([[0, 0, 1],
# [1, 0, 0],
# [0, 1, 0]]) def get_np_represent(result):
x = np.zeros([len(result),len(result)]) for i,v in enumerate(result):
x[i, v] = 1
return x # 判断相应的行(横、纵、左下对角线、右下对角线)是否满足需要
def line_not_pass(np):
return (np > 1).any() # 获取左下对角线相加的数组
def left_diag_array(np_array): left_diag_array = [np.sum(np.diag(np.fliplr(np_array), d)) for d in range(len(np_array) - 1, -len(np_array), -1)] return np.array(left_diag_array) # 获取右下对角线相加的数组
def right_diag_array(np_array):
right_diag_array = [np.sum(np.diag(np_array, d)) for d in range(len(np_array) - 1, -len(np_array), -1)]
return np.array(right_diag_array) match_count = 0 # main
for arr in itertools.product(list(range(0,BOARD_SIZE)),repeat=BOARD_SIZE): np_array = get_np_represent(arr) row_array = np_array.sum(axis=1)
if line_not_pass(row_array):
continue
col_array = np_array.sum(axis=0)
if line_not_pass(col_array):
continue if line_not_pass(left_diag_array(np_array)):
continue if line_not_pass(right_diag_array(np_array)):
continue match_count +=1 print("total count:",match_count)

使用穷举法结合numpy解决八皇后问题的更多相关文章

  1. 作业:for循环,迭代法和穷举法

                                                    for()循环 四要素:初始条件,循环条件,状态改变,循环体. 执行过程:初始条件--循环条件--循环体 ...

  2. for循环语句以及迭代法和穷举法

    循环语句: 四要素:初始条件,循环条件,状态改变,循环体 for(初始条件;循环条件;状态改变){ //循环体} 案例1:打印等腰直角三角形和菱形 左上三角 static void Main(stri ...

  3. C#4 for循环 迭代法 穷举法应用

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  4. C# for 循环 迭代法 穷举法

    for()循环. 四要素: 初始条件,循环条件,状态改变,循环体. 执行过程: 初始条件--循环条件--循环体--状态改变--循环条件.... 注意:for的小括号里面分号隔开,for的小括号后不要加 ...

  5. 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法

    For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...

  6. 穷举法、for循环、函数、作用域、斐波那契数

    1.穷举法 枚举所有可能性,直到得到正确的答案或者尝试完所有值. 穷举法经常是解决问题的最实用的方法,它实现起来热别容易,并且易于理解. 2.for循环 for语句一般形式如下: for variab ...

  7. C# 异常语句 跳转语句 while循环 穷举法 迭代法

    一  异常语句   ♦ try.....catch....finally 结构形式 try{ 可能会出错的代码语句 如果这里出错了,那么不会在继续下面的代码,而是直接进入catch中处理异常}catc ...

  8. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  9. 基本算法思想之穷举法(C++语言描述)

    穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...

随机推荐

  1. 中国MOOC_零基础学Java语言_第3周 循环_1奇偶个数

    第3周编程题 查看帮助 返回   第3周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...

  2. database 学习

    ref : 什么是NoSQL,为什么要使用NoSQL?

  3. 20191127 Spring Boot官方文档学习(9.1-9.3)

    9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...

  4. c++ 取整:四舍五入 向上取整 向下取整

    对于数据的取整是经常需要考虑的 现在总结如下 #include<iostream> #include<cmath> using namespace std; int main( ...

  5. Linux 最常用命令整理,建议收藏!

    Linux是目前应用最广泛的服务器操作系统,基于Unix,开源免费,由于系统的稳定性和安全性,市场占有率很高,几乎成为程序代码运行的最佳系统环境. linux不仅可以长时间的运行我们编写的程序代码,还 ...

  6. C++中的析构顺序和cosnt对象

    1,当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 2,单个对象创建时构造函数的调用顺序(工程经验总结): 1,调用父类的构造过程: 2,调用成员变量的构造函数(调用顺序与声明顺序相同): ...

  7. 中标麒麟(linux)mysql配置记录

    刚装好mysql时,使用正常,后来再次使用时,连接不成功.(虚拟机中) 配置网络有问题, 1.我将ifcfg-*的两个文件备份后删除了. 2.点击右下角的小电脑,重新新建一个网络连接.把网络接入主机的 ...

  8. vue 圆形进度条组件解析

    项目简介 本组件是vue下的圆形进度条动画组件 自由可定制,几乎全部参数均可设置 源码简单清晰 面向人群 急于使用vue圆形进度条动画组件的同学.直接下载文件,拷贝代码即可运行. 喜欢看源码,希望了解 ...

  9. 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd

    https://www.luogu.org/problem/P1522 好坑啊,居然还有直径不通过新边的数据,还好不是很多. 注意一定要等Floyd跑完之后再去找连通块的直径,不然一定是INF. #i ...

  10. linux中几个简单的系统命令(还有一些其他杂项命令)

    linux中几个简单的系统命令,其他命令接触到了在补充. 1.ps命令:(process status),提供对进程的一次性查看.以及执行ps命令时那个时刻的进程信息 格式:ps[参数] -e 此参数 ...