深搜这个算法相信大家肯定都不陌生吧,它是算法中基础中的基础,它运用到的就是递归了,它还隐式的包含了一种数据结构——栈,我在理解这个算法的时候可吃了不少苦头,花了不少时间,但是一旦掌握,你的思维可以说会提升一个档次,下面让我们一起来看看什么是深搜算法。
算法例题:要说涉及到深搜的问题,不得不说一个名字——n皇后问题,其中n皇后问题中最出名的就是把皇后了,下面我们看看这题目是怎么样的。
首 先来看这张图片:这是n==8时候的一种情况,但是这只是其中的一种情况,我们要怎么输出所有的情况呢,如果用一般的数组来写的话显然不可能,顶多只能找 到所有解中的某几组,我们试试深搜,当找到其中的一组解之后,使程序在尝试搜索下一组解,直至所有的解都搜索完毕,咦?好像可以做到的样子,行,那我们来 试试吧。
#include<iostream> #include<math.h> using namespace std; int a[8][8],b[8];//a数组表示棋盘最大为8*8,b数组用来表示列,如要表示第i行的列就表示为b[i] int n,sum; bool check(int n) { for(int i=0;i<n;i++) { //b[i]==b[n]来判断是否同一列,abs(i-n)==abs(b[i]-b[n])来判断是否同一对角线 //这个判断对角线的方法读者稍微想一下就能明白 if(b[i]==b[n]||abs(i-n)==abs(b[i]-b[n])) return 0; } return 1; } void dfs(int x) { for(int i=0;i<n;i++) { b[x]=i;//(x,b[x]) if(check(x))//来判断是否跟已经放好在同一列,或是同一个对角线上 { if(x==n-1)//若棋子已经放到第n行了,则说明已经出现一种情况了,则sum+1 { sum++; //下面这段打注释的代码是输出每种情况时棋盘状态,读者可先删除 /*a[x][b[x]]=1; for(int p=0;p<n;p++) { for(int q=0;q<n;q++) { cout<<a[p][q]<<" "; } cout<<endl; } cout<<endl; a[x][b[x]]=0;*/ return;//返回寻找下一种情况 } else { a[x][b[x]]=1;//放上棋子 dfs(x+1);//x还没放到第n行则继续放 a[x][b[x]]=0;//将原来已放的棋子拿掉 } } } } int main() { while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); sum=0; dfs(0);//从第0行开始搜 cout<<sum<<endl; } return 0; }
相关推荐
在本项目中,我们探索了两种基础但至关重要的图遍历算法——深度优先搜索(DFS,Depth-First Search)和广度优先搜索(BFS,Breadth-First Search),并将其应用于解决自动寻路的迷宫问题。C++的MFC(Microsoft ...
本篇文章将深入探讨一种特殊的图遍历算法——深度优先搜索(Depth-First Search, DFS)以及其在图数据结构中的应用。通过定义临界表,并结合具体的代码实现,我们能够更好地理解DFS的基本原理及其应用场景。 #### ...
内容概要:本文详细介绍了迷宫求解这一经典算法问题,涵盖了迷宫表示方法和常见的三种算法——深度优先搜索(DFS)、广度优先搜索(BFS)及A*算法。文章通过Python代码示例展示了使用深度优先搜索实现的具体步骤。 ...
常见算法包括排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索、最短路径算法Dijkstra、Floyd-Warshall)、动态规划等。...
在数据结构中,算法通常用于操作数据结构,如排序算法(冒泡排序、插入排序、快速排序、归并排序等)、查找算法(顺序查找、二分查找等)和图遍历算法(深度优先搜索、广度优先搜索)等。掌握高效算法能够优化程序...
本篇文章将详细介绍两种常用的图遍历算法——深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS),并探讨它们的应用场景。 #### 二、基本概念 在讨论具体的算法之前,我们需要...
描述中的“关于八数码难题的程序 大虾请进 用的是有界深度优先搜索算法”提示我们,这个程序使用了一种高效的搜索策略——有界深度优先搜索,这是针对八数码难题的一种解决方案。通常,深度优先搜索(DFS)是遍历图...
图的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS)。 在算法方面,这份资源可能涵盖了排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、查找算法(如线性查找、二分查找、哈希...
- 树的遍历:前序、中序、后序遍历,理解深度优先搜索(DFS)和广度优先搜索(BFS)。 - 树的构造与销毁:构建特定类型的树,如满二叉树、完全二叉树。 4. **图结构** - 图的表示:邻接矩阵和邻接表,根据问题...
- **图**:由顶点和边组成,用于表示对象间的关系,有图遍历算法如深度优先搜索和广度优先搜索。 - **散列表(哈希表)**:通过哈希函数实现快速查找,解决冲突的方法有开放寻址法和链地址法。 2. **算法**: - ...
算法是解决问题的步骤集合,包括排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、搜索算法(如深度优先搜索、广度优先搜索)、图算法(如Dijkstra最短路径算法、Floyd-Warshall所有最短...
常见的算法包括排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图算法(如Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法)等。在C++中,我们可以利用模板类...
3. **排序与搜索算法**:书中可能会讲解各种排序算法(冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等)和搜索算法(顺序搜索、二分搜索、深度优先搜索、广度优先搜索等)。排序算法用于整理数据,而...
《数据结构算法——Visual C++ 6.0程序集》是一部专为学习和实践数据结构与算法设计的书籍,特别适合使用C++编程语言的读者。本书通过Visual C++ 6.0这一经典开发环境,提供了丰富的实例代码,旨在帮助读者深入理解...
常见的算法包括排序(如冒泡排序、快速排序、归并排序)、查找(如线性查找、二分查找)、图算法(如深度优先搜索、广度优先搜索)等。理解算法的时间复杂度和空间复杂度对于优化代码性能至关重要。 C语言因其简洁...
搜索算法部分则涉及深度优先搜索、广度优先搜索以及二分查找等,这些都是解决复杂问题的基础工具。图算法部分则涵盖了最短路径算法(如Dijkstra算法和Floyd-Warshall算法)、最小生成树算法(如Prim算法和Kruskal...
递归在树遍历、排序算法(如快速排序、归并排序)以及搜索问题(如深度优先搜索)中有广泛应用。 后续章节可能包括树与图的结构、排序与查找算法、图论问题、哈希表、文件结构等内容。这些章节会深入讨论各种数据...