`
huyifan951124
  • 浏览: 82955 次
社区版块
存档分类
最新评论

基础算法——深度优先搜索

 
阅读更多

深搜这个算法相信大家肯定都不陌生吧,它是算法中基础中的基础,它运用到的就是递归了,它还隐式的包含了一种数据结构——栈,我在理解这个算法的时候可吃了不少苦头,花了不少时间,但是一旦掌握,你的思维可以说会提升一个档次,下面让我们一起来看看什么是深搜算法。

算法例题:要说涉及到深搜的问题,不得不说一个名字——n皇后问题,其中n皇后问题中最出名的就是把皇后了,下面我们看看这题目是怎么样的。
在nXn格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法.
基础算法——深度优先搜索 - acm帆 - huyifan的博客
 
 
 

 首 先来看这张图片:这是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的基本原理及其应用场景。 #### ...

    迷宫求解算法及其Python实现

    内容概要:本文详细介绍了迷宫求解这一经典算法问题,涵盖了迷宫表示方法和常见的三种算法——深度优先搜索(DFS)、广度优先搜索(BFS)及A*算法。文章通过Python代码示例展示了使用深度优先搜索实现的具体步骤。 ...

    数据结构与算法——C++版.rar

    常见算法包括排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序)、搜索(如线性搜索、二分搜索)、图算法(如深度优先搜索、广度优先搜索、最短路径算法Dijkstra、Floyd-Warshall)、动态规划等。...

    《数据结构算法——Visual C++ 6.0程序集》电子教案

    在数据结构中,算法通常用于操作数据结构,如排序算法(冒泡排序、插入排序、快速排序、归并排序等)、查找算法(顺序查找、二分查找等)和图遍历算法(深度优先搜索、广度优先搜索)等。掌握高效算法能够优化程序...

    第六次深度优先广度优先.pdf

    本篇文章将详细介绍两种常用的图遍历算法——深度优先搜索(Depth-First Search, DFS)和广度优先搜索(Breadth-First Search, BFS),并探讨它们的应用场景。 #### 二、基本概念 在讨论具体的算法之前,我们需要...

    bashuma.rar_bashuma _八数码_八数码 深度_有界 深度优先 搜索 八数码 难题_深度优先搜索

    描述中的“关于八数码难题的程序 大虾请进 用的是有界深度优先搜索算法”提示我们,这个程序使用了一种高效的搜索策略——有界深度优先搜索,这是针对八数码难题的一种解决方案。通常,深度优先搜索(DFS)是遍历图...

    C语言数据结构所有算法——源代码

    图的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS)。 在算法方面,这份资源可能涵盖了排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、查找算法(如线性查找、二分查找、哈希...

    《数据结构算法实现》随书代码

    - 树的遍历:前序、中序、后序遍历,理解深度优先搜索(DFS)和广度优先搜索(BFS)。 - 树的构造与销毁:构建特定类型的树,如满二叉树、完全二叉树。 4. **图结构** - 图的表示:邻接矩阵和邻接表,根据问题...

    数据结构与算法——C++版

    - **图**:由顶点和边组成,用于表示对象间的关系,有图遍历算法如深度优先搜索和广度优先搜索。 - **散列表(哈希表)**:通过哈希函数实现快速查找,解决冲突的方法有开放寻址法和链地址法。 2. **算法**: - ...

    数据结构算法——Visual C++6.0程序集

    算法是解决问题的步骤集合,包括排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、搜索算法(如深度优先搜索、广度优先搜索)、图算法(如Dijkstra最短路径算法、Floyd-Warshall所有最短...

    数据结构与算法——C++版(第2版)

    常见的算法包括排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图算法(如Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法)等。在C++中,我们可以利用模板类...

    数据结构与算法——C++版(第3版)源文件

    3. **排序与搜索算法**:书中可能会讲解各种排序算法(冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等)和搜索算法(顺序搜索、二分搜索、深度优先搜索、广度优先搜索等)。排序算法用于整理数据,而...

    《数据结构算法——Visual C++ 6.0程序集

    《数据结构算法——Visual C++ 6.0程序集》是一部专为学习和实践数据结构与算法设计的书籍,特别适合使用C++编程语言的读者。本书通过Visual C++ 6.0这一经典开发环境,提供了丰富的实例代码,旨在帮助读者深入理解...

    数据结构与算法——C版

    常见的算法包括排序(如冒泡排序、快速排序、归并排序)、查找(如线性查找、二分查找)、图算法(如深度优先搜索、广度优先搜索)等。理解算法的时间复杂度和空间复杂度对于优化代码性能至关重要。 C语言因其简洁...

    算法导论————————————

    搜索算法部分则涉及深度优先搜索、广度优先搜索以及二分查找等,这些都是解决复杂问题的基础工具。图算法部分则涵盖了最短路径算法(如Dijkstra算法和Floyd-Warshall算法)、最小生成树算法(如Prim算法和Kruskal...

    数据结构算法——Visual C++ 6.0程序集PPT

    递归在树遍历、排序算法(如快速排序、归并排序)以及搜索问题(如深度优先搜索)中有广泛应用。 后续章节可能包括树与图的结构、排序与查找算法、图论问题、哈希表、文件结构等内容。这些章节会深入讨论各种数据...

Global site tag (gtag.js) - Google Analytics