首页 > 其他分享 >DFS深度优先搜索

DFS深度优先搜索

时间:2024-08-15 23:23:21浏览次数:9  
标签:优先 int 斜线 DFS ++ 搜索 udg dg 皇后

1、介绍

DFS即Depth First Search,深度优先搜索。简单地理解为一条路走到黑。

在这里插入图片描述

以该图为例:先走A,然后到B,到了B有三种情况,意味着这条路还没走完,那我就接着走,从B走到E,走到E之后没路了。那我就回溯到B,为什么呢?

在这里插入图片描述

因为我原本走到B的时候就有三种情况,但是刚刚只走了一种情况,因此我要回到B再去尝试第二条路,于是我们就从E回到B,然后从B去F。到了F,又没路了,那我们就回到B走第三种情况,从B到G。这样我们就走完了从A->B的三种情况。又因为在A处其实还有三种情况,因此我们走完B的三种情况后,回到A,去走除了从A->B的第二种情况,即A->C。由此以往。

2、题目1排列数字
在这里插入图片描述解题思路

首先是一条路走到黑

在这里插入图片描述

然后开始回溯 因为 1 2 __ 后面只能写3 所以继续回溯发现第二位可以填3 然后第三位填2,如下图所示

在这里插入图片描述

最终可以得到这样的

在这里插入图片描述

代码
#include <iostream>

using  namespace std;
const int N = 10;
int path[N];//记录的是路径
bool a[N]; // 记录的是数组中的值是否被使用过
int n;

void def(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++) cout << path[i];
		puts("");
		return;
	}
	for (int i = 1; i <= n; i++)
		if ( !a[i] ) //如果没有被使用过
		{
			path[u] = i;
			a[i] = true; //标记为使用过了
			def(u + 1);//遍历下一位
			a[i] = false;

		}
}
int main()
{
	cin >> n;

	def(0);
	return 0;
}

3、题目2 n皇后问题

n−皇后问题是指将 n个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

在这里插入图片描述

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。

数据范围:

1≤n≤9

输入样例:

4

输出样例:

.Q…
…Q
Q…
…Q.

…Q.
Q…
…Q
.Q…

代码分析1:

每一行只能放一个皇后,每一行都要放一个皇后:

所以可以枚举每一行,枚举每一行 这个皇后就放到每一行上去

1 3 __ __

1是指 第一行第一个位置放一个皇后

3是指 第二行 第三个位置放一个皇后

在这里插入图片描述

bool dg[N], udg[N];//正对角线(蓝色),斜对角线(绿色)
//个数为2n-1

对于判断是否在同一主斜线(棋盘内与主对角线平行的斜线),我们使用 udg[] 数组,可以任取一个棋盘位(x,y),并观察主斜线上该点与其他点位之前的规律:

在这里插入图片描述

可以发现:主斜线上采样的多个点的x、y值的差,即说明多个点可通过减法映射到数组中的同一位置,判断斜线上是否出现过一次皇后,即查看 dia[x - y] 是否为空即可。但这样做减法时可能会得到一个负数,是没法直接映射到数组中的,因此主斜线上做判断时统一加上一个常量保证非负,即dia[x - y + n]。

同理,对于判断是否在同一副斜线(棋盘内与副对角线平行的斜线),我们使用 udia[] 数组,可以任取一个棋盘位(x,y),并观察副斜线上该点与其他点位之前的规律:

在这里插入图片描述

可以发现:主斜线上采样的多个点的x、y值的和,即说明多个点可通过加法映射到数组中的同一位置,判断斜线上是否出现过一次皇后,即判断 udia[x + y] 是否为空即可。

代码1:
#include <iostream>

using namespace std;
const int N = 10000;
int n;
char a[N][N];
bool st[N], dg[N], udg[N];

void dfs(int u)
{
	if (u == n)
	{
		for (int i = 0; i < n; i++) puts(a[i]);
		puts("");
		return;
	}
	for (int i = 0; i < n; i++)
	{
		if (!st[i] && !dg[u + i] && !udg[n - u + i])// 这一行
		{
			a[u][i] = 'Q';
			st[i] = dg[u + i] = udg[n - u + i] = true;
			dfs(u + 1);
			st[i] = dg[ u + i] = udg[n - u + i] = false;
			a[u][i] = '.';
		}

	}

}

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			a[i][j] = '.';

	dfs(0);
	return 0;
}

标签:优先,int,斜线,DFS,++,搜索,udg,dg,皇后
From: https://blog.csdn.net/weixin_73378557/article/details/141144909

相关文章

  • 广度优先算法 BFS总结(算法详解+模板+例题)
    一.bfs是什么广度优先搜索(Breadth-FirstSearch,简称BFS),是一种图遍历算法。它从给定的起始节点开始,逐层地向外扩展,先访问起始节点的相邻节点,然后再访问相邻节点的相邻节点,以此类推,直到遍历完所有可达节点。二.基本思路1.一直往前走,直到到达终点。2.遇到分岔路口直接分出几条......
  • 小猫爬山——dfs模板题一道
    最近做搜索里面的题目,发现还是有很多漏洞的比如下面这道小猫爬山题,还是不会做看的答案...气死我了小猫爬山时间限制: 1.000 Sec  内存限制: 128MB提交 状态题目描述Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦......
  • 易优searchform功能:文档标题搜索,默认搜索整站-Eyoucms标签手册
    【基础用法】名称:searchform功能:文档标题搜索,默认搜索整站语法:{eyou:searchformtype='default'}<formmethod="get"action="{$field.action}"><inputtype="text"name="keywords"/><inputtype......
  • VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
    `timescale1ns/1nsmoduleencoder_83(input[7:0]I,inputEI,outputwire[2:0]Y,outputwireGS,outputwireEO);assignY[2]=EI&(I[7]|I[6]|I[5]|I[4]);assignY[......
  • LeetCode530 二叉搜索树的最小绝对差
    前言题目:530.二叉搜索树的最小绝对差文档:代码随想录——二叉搜索树的最小绝对差编程语言:C++解题状态:成功解决!思路注意题目中的二叉搜索树,这个条件暗示每个节点的左子节点肯定小于该节点,右子节点肯定大于该节点。因此,使用中序遍历可以获得一个递增的有序数组,最......
  • LeetCode501 二叉搜索树中的众数
    前言题目:501.二叉搜索树中的众数文档:代码随想录——二叉搜索树中的众数编程语言:C++解题状态:不会…思路利用二叉搜索树性质的同时再加上双指针法。代码/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*lef......
  • VL13 优先编码器电路
     `timescale1ns/1nsmoduleencoder_0(  input   [8:0]    I_n ,    outputreg[3:0]    Y_n );always@(*)begin  casex(I_n)  9'b1_1111_1111:Y_n=4'b1111;  9'b0_xxxx_xxxx:Y_n=4'b0110;  9'b1_0xxx......
  • 使用 JavaScript 进行线性搜索
    一.介绍线性搜索,也称为顺序搜索,是一种用于在列表中查找特定值的简单搜索算法。它的工作原理是逐个检查列表中的每个元素,直到找到所需的值或到达列表的末尾。以下是线性搜索如何工作的逐步描述。**从头开始:**从列表的第一个元素开始。**比较各个元素:**将当前元素与目标值......
  • 【二叉树进阶】--- 二叉搜索树转双向链表 && 最近公共祖先
     Welcometo9ilk'sCodeWorld    (๑•́₃•̀๑) 个人主页:     9ilk(๑•́₃•̀๑) 文章专栏:   数据结构本篇博客我们继续了解一些二叉树的进阶算法。......
  • 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450
    二叉搜索树的最近公共祖先题目根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)TreeNode*getroot(TreeNode*root,TreeNode*p,TreeNode*q){ if(rooot==NULL)returnNULL; if(root->val<p->val&&root->val<q->val){ returngetroot(r......