dfs算法详解(n皇问题实现)

news/2024/7/20 22:02:10 标签: 深度优先, 算法, 数据结构

dfs又称为深度优先搜索算法

我们采用先了解dfs的基本思路

然后根据n皇后一题

进行dfs算法讲解

大家如果是来看n皇后问题的实现

可以直接看到后面的代码

————————————我是分割线

首先博主先大概讲解一下dfs的思路

dfs涉及到了递归与回溯

博主在下面会详细的介绍

先看下思路:

dfs就是按照你所给的顺序

先向一条路一直走

直到走到尽头后

才回头(回溯)

然后找到回头后可以选择的下一条道路

然后再走到尽头

直到把所有道路走完

或者满足你要找到的结果然后停下

可能比较难理解

我们以n皇后问题

进行详解

#include<stdio.h>
#include<iostream>
using namespace std;
#include<math.h>
int rk[20];//存储皇后所在地,下标表示所在行,下标的数字表示所在列
bool vis[20];//只能存储true和false,用来记录该列是否被使用过
int n, cnt = 0;//cnt表示有多少种方法
bool flag;
void dfs(int pos)
{
	if (pos == n + 1)//判定条件:即已经放置完了n个皇后,也就是走到了尽头
	{
		cnt++;//能够通过的方法加一
		if (cnt <= 3) 
		{
			for (int i = 1; i <= n; i++)
			{
				cout << rk[i] << " ";
			}
			cout << endl;//满足题目输出前三项
		}
	}
	for (int i = 1; i <= n; i++)//i代表第几列,向下走
	{
		if (vis[i] == false)//如果该列没有被标记过
		{
			flag = true;
			for (int j = 1; j < pos; j++)
			{
				if (abs(rk[j] - i) == abs(j - pos))//abs是对于数值取绝对值的意思
//划重点啦:n皇后是否在一条斜线上可以用需要检测的两个皇后所在的位置行与行,列与列相减
//相同的话就代表在一条斜线上,大家可以自己试一下
				{
					flag = false;//如果在一条斜线上面就让让flag为假,与下面对应
					break;
				}
			}
			if (flag)//为真的话代表可以在该处放置n皇后
			{
				rk[pos] = i;//放置n皇后
				vis[i] = true;//标记该列已经放置n皇后
				dfs(pos + 1);//进行递归,也就是不断向前走
				vis[i] = false;//递归回来,将该处取消标记
			}
		}
	}
}
int main() {
	cin >> n;
	dfs(1);
	cout << cnt;
	return 0;
}


http://www.niftyadmin.cn/n/1036969.html

相关文章

Objective-C与Objective-C++的混用代码示例

很多已经熟悉C/C的朋友在初次使用Objective-C作为开发语言时不是很习惯&#xff0c;不过objective-C/C本身又是几乎完全兼容GNU C/C的。 这里作为一个代码实例来描述Objective-C与objective-C如何混合使用。其实这就同C与C如何混用一样&#xff0c;还是非常容易上手的。 不 过&…

iPhone文件系统NSFileManager讲解

iPhone文件系统NSFileManager讲解是本文要介绍的内容&#xff0c;主要是通过iphone文件系统来学习NSFileManager的使用方法&#xff0c;具体内容来看本文详解。 iPhone文件系统&#xff1a;创建、重命名以及删除文件&#xff0c;NSFileManager中包含了用来查询单词库目录、创建…

element el-dropdown 水平居中

这个组件确实有点坑 他在每次初始化时都会根据位置自己产生定位数 而且他的父元素直接就是app 用穿透去改很多时候会带来新的问题 解决方案如下 首先 设置placement属性 <el-dropdown trigger"click" placement"bottom" ></el-dropdown> pl…

终别(牛客)详解

#include<stdio.h> long long a[1000002]; long long b[1000002]; long long arr[1000002]; long long brr[1000002]; #include<iostream> using namespace std; int main() {long long n, i, x, min1, min2, min3, MN;x 1e18;//取一个极大值scanf("%lld&quo…

最快求素数(质数)详解

我们经常会遇见一些题 要求我们判断一个数是否为素数&#xff08;质数&#xff09; 博主在这里讲解一种最快求素数的方法 能大量节约你的运行代码所花费的时间 废话不多说 我们先来了解一下素数的定义&#xff1a; 只能被常数1或自己整除&#xff0c;不能被其他整数整除的…

java泛型类

泛型是一种数据规范和限制 在集合中较为常见 但我们也可以用泛型对类数据进行操作 话不多说 先来看代码 我们先来创建一个包 下面有两个类 customException 用于泛型类定义 参考代码如下 public class customException<T> {private T variable;public T getVariable…

Betsy的旅行详解(c++)

#include<stdio.h> #include<iostream> using namespace std; int map[10][10],bj[10][10];//map数组记录此位置周围可走格子数&#xff0c;bj为标记数组 int n, ans0; struct fx {int nx;int ny; }around[] { {0,-1}, {0,1}, {-1,0}, {1,0} }; bool in(int x, in…

并查集及优化方案(图文详解)

什么交并查集勒 我们采用官方解释 并查集&#xff1a;并查集 &#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不交集数据结构&#xff09;是一种 数据结构 &#xff0c;用于处理一些 不交集 &#xff08;Disjoint sets&#xff0c;一系列没有重复…