python DFS深度优先搜索及N皇后问题求解
DFS可谓是算法里的一个大头,不懂DFS都不敢承认自己学过数据结构。今天菜鸡我要逆袭了,先从经典的N皇后问题搞起,试试DFS水深几尺【略加思索】
内容篇幅有点长,不想看我对DFS嗷嗷叫的朋友还是直接去见皇后吧~
1. 对DFS的理解
2.N皇后问题
1. 对DFS的理解
解决这个问题前,先来回顾下DFS究竟是何方神圣 `<" - ">`
DFS——depth first search也就是深度优先搜索。顾名思义,我们在寻找问题的解决办法时,在符合条件的情况下,先一根经走下去找可行解,寻找完后,原路返回上一步,寻找是否有其他可行的解。如果没有则再原路返回;如果有可行的路则继续往前,朝更深的地方走。这种先往深度搜索,再原路返回搜索其他解,直到把所有路线都遍历完的方法叫深度优先搜索
好像还不是很清楚,那就举个更具体的例子吧~
小张看到远处彩色的房子超级羡慕,想要经常去那玩,但小张又超级懒,他想要寻找一条最近的路线,省的每次多走不必要的路程(毕竟不是大学生不用记步数)
小张觉得先探索完每一个路口的所有分叉路再探索下一个路口的所有分叉路没有直接一条路走到彩色房子处再原路返回寻找下一条到彩色房子的路线刺激,于是他开始了充满智慧的探索。(以下省略n多废话)
trail 1:A->B->E->F 看到彩色的房子啦!不急进去先,折回E路口看看,没有其他路了;再折回B点,嗯、还有其他路
trail 2:A->B->D->F 此时,折回D点观察下,还有条到A的路诶,可以回去吗?不行!这不前功尽弃了嘛,而且A在B的上一步。小张回去了,怎么判断在B处是否还有其他口可以走呢?所以D不行的话,我们返回到B,哦豁,B也没有了,再返回到A。天无绝人之路啊,还有通往D和C的路。小张是个很路痴的人,所以他每次都按从上到下的顺序走,免得忘记刚走的路了。这里我们先到D。
trail 3:A->D->B->E->F 相继折回E、B都没发现其他没走的路,折回D,发现有条直接到彩色房子诶
trail 4:A->D->F 折回D,没有其他路了,再折回A
trail 5:A->C->F 相继折回C、A发现没有未探索的路了。小张呼得舒了一口气,这下终于知道哪条路最省时了。
貌似道理都懂了,但是具体怎么用代码实现呢?还是一头雾水哇
2.N皇后问题
现在我们以经典的N皇后问题作为开胃菜感受下吧~
在n×n的棋盘上放置n个皇后,任两个皇后都不能处于同一行、列或同一条斜线上,所谓一山不能容二虎,使得任何一个皇后都无法直接杀掉其他的皇后。问:有多少种放法?(朋友们可以以n=4时的情况试下,如果运行有误,别慌,将一些信息打印出来看看,一步步思考校正自己的问题出在哪,哪里的逻辑还不明了,要特别注意递归和return的关系)
为方便描述,这里以坐标表示。先在(0,0)处放一个皇后,因为任两个皇后都不能处于同一行、同一列或同一条对角线上,所以我们进入第二行,判断皇后的位置是否可行。(1,0)在同列了,(1,1)在同一条对角线上,再下一个(1,2)满足条件,我们记录下皇后的位置。怎么判断是否在对角线上呢?对角线是45°角!所以两个点的横轴距离和纵轴距离相等就行啦!
接着第三行,发现每个位置都不行,那么我们返回到第二行。还好我们记录下了皇后的位置,接着就在ex皇后的下一个位置进行判断是否可行。可行!再进入第三行,第一个不成,第二个(2,1)成!进入第四行,发现到第四个了还是不成,还是返回上一行吧。第三行ex皇后的下个和下下个都不符合条件,而且已经是第四个了,那就返回到上一行。发现第二行ex皇后(1,3)已经是最后一个啦,那就只能返回到第一行了。此时从(0,1)开始进行判断。(此处省略n多字)如果找到一组解了,也就是终于有皇后在第四行安家了,那么我们记录下解的个数,并返回到上一行,搜索下有木有其他的可行解。
(x,y) | 0 | 1 | 2 | 3 |
0 | Q | |||
1 | Q | |||
2 | ||||
3 |
(x,y) | 0 | 1 | 2 | 3 |
0 | Q | |||
1 | Q | |||
2 | Q | |||
3 |
(x,y) | 0 | 1 | 2 | 3 |
0 | Q | |||
1 | ||||
2 | ||||
3 |
答案:n
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
total | 1 | 0 | 0 | 2 | 10 | 4 | 40 | 92 | 352 | 724 |
废话不多说,上代码!
def judge(row): # 判断是否在同一列、同一对角线上if row == 0:return Truefor i in range(row):if abs(col[row]-col[i]) == row-i or col[row] == col[i]: # 若在对角线上则两个皇后横轴和纵轴的距离相等return Falsereturn Truedef dfs(row):global map1, col, cnt, n # 变成全局变量 省的调用if row == n:cnt += 1 # 记录可放置的方式returnwhile col[row] < n: # 如果第(row+1)行还没判断完 判断是否有满足条件的位置if judge(row): # 如果该位置可放皇后 进行下一行搜索dfs(row+1)col[row] += 1 # 标记本行位置的下一位 回溯时防止走重复的路else: # 如果该位置不可放皇后 则移到下一个位置col[row] += 1if col[row] == n: # 如果一行的位置都遍历了 也没满足条件的 将此位置信息清零 返回上一行col[row] = 0returnn = int(input("Queens' number: ")) # 皇后数量
map1 = [([]*n)for i in range(n)] # 棋盘
col = [0]*n # 记录每一行的皇后在第几列
cnt = 0 # 可放置的方式记录
dfs(0) # 深度优先搜索 采用回溯法 递归法
print(cnt) # 输出可放置方式总数
python DFS深度优先搜索及N皇后问题求解相关推荐
- 【蓝桥杯C/C++】专题五:DFS深度优先搜索
专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...
- “暴力美学1”——DFS深度优先搜索
作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...
- 图:DFS(深度优先搜索)图解分析代码实现
文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...
- DFS——深度优先搜索基础
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review DFS--深度优先搜索 的基础知识: [1]深度优先搜索的应用 1.1)深度优先搜索算法描述(转自 ...
- 【算法】蓝桥杯dfs深度优先搜索之排列组合总结
[导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...
- dfs深度优先搜索_图的深度优先搜索(DFS)
dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...
- DFS(深度优先搜索)算法实现
2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...
- 张三踩瓷砖:C++用DFS深度优先搜索解POJ1979 Red and Black问题
POJ1979 Red and Black 题目链接: POJ1979 Red and Black 简单理解一下题目: 张三站在一个长方形的房间里,房间里铺满了方形瓷砖,瓷砖有红色和黑色两种,他站在其 ...
- 【算法】蓝桥杯dfs深度优先搜索之图连通总结
前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结> → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,第三次声明下文的 ...
最新文章
- 牛顿法求解非线性方程的根
- Java 洛谷 P1150 Peter的烟
- 每天一道LeetCode-----回文链表
- c++学习笔记之数组及vector
- 软件测试工程师-软件测试基本介绍
- 20180517 迭代器
- 人工智能目标检测模型总结(一)——R-CNN、Fast R-CNN、Faster R-CNN
- java流框架_Java中的IO框架流二
- Vue组件创建和组件传值
- 学不会模具设计的原因你知道吗?
- 倒排索引的MapReduce实现
- 解决IE兼容H5的问题
- 微信文章如何自动排版
- C++实现积分函数(第一章)
- 设置密码复杂度、密码有效期,重新制作ISO,安装后登录系统必须重新修改密码
- 领英工程VP:如何用 AI 消除 AI 偏见,打造高级人才推荐系统
- css背景设置,让套图中某张图片居中显示的例子
- freeSwitch DISA实现
- 火车票余票问题的算法解析(续)
- Ackerman函数的实现算法