首页 > 其他分享 >dfs理解——以出栈方式的字典序为例(对上一个出栈字典序的完善和强化)

dfs理解——以出栈方式的字典序为例(对上一个出栈字典序的完善和强化)

时间:2023-09-01 11:37:12浏览次数:30  
标签:出栈 int top 栈顶 序为例 dfs 还原 节点 字典

笔者认为,dfs的本质在于试验每一方向还原

试验每一方向的含义是:将实际题目中的条件几何化为多个方向,给这些方向赋予优先级(一般采用在dfs函数中写入顺序为优先级,这样比较简单方便),按照优先级的顺序来进行试验,每个节点都有基本相同的方向和优先级的,就可以使用dfs的方式解决。

 

还原:还原要结合试验方向来看。试验方向的终止有几种可能——到达限制边缘,到达转出终点,该节点所有方向已经遍历。当试验方向终止时,我们需要回到上一节点,这一动作我称为回溯。回溯分为两个部分比较容易理解:第一部分是在几何层面上把依托成几何化坐标的条件回到上一坐标,一般我会把这些几何化的条件作为dfs的参数,将条件几何化的目的本身就是为了便于直接回到上一节点。第二部分是还原,也就是一般情况下比较困难的部分,它不像几何参数那么直接,我们需要找到在各种情况下我们所需要的除几何参数以外的变量的上一状况,最容易的方法是在需要还原的变量改变前用另外的变量将原值记录然后在回溯时重新赋回原值。(此处需要特别注意,并不是所有变量都需要还原,需要结合题意找出和每一操作撤销密切相关同时又多半作为变化基础的变量)

 

为了代码的简洁,在有时间充裕的情况下,找到题目的特异性规律可以让还原所需要的变量的过程变得简单明了很多。

 

此处给出普适思路源代码:

#include<iostream>

using namespace std;

 

int n, m;

int a[15], b[15];

int stack[16];

int top = -1;

 

void dfs(int x, int y){

       if(x == n && y == n){//结束出口,此处到终点

              for(int i = 0; i<n; i++)

                     cout<<a[i]<<" ";

              printf("\n");

              return;

       }

 

//y放在x前,作用为能上先上,不能上再右,和条件希望得到字典序有关

 

//入栈和出栈的操作和还原都对top指针有影响,所以x、y操作部分代码各自对top指针有加减 

 

       if(y<n&&y<x){//限制条件,限定关系条件和边缘

              a[y] = stack[top];//既是赋值出栈序列又是保存栈顶内容 (栈顶内容是每次节点变动栈内容唯一变动的,因为按照这道题意一次只变一个,所以保存栈顶就是保存栈的内容)

              --top;

              dfs(x, y+1);

              ++top;

              stack[top]=a[y];//还原栈顶内容

       }

             

       if(x<n){//限制条件,限定关系是x>=y,但是上面的if已经有这个效果故省略,限定边缘

              ++top;

              b[top] = stack[top];//保存栈顶内容 (因为每个节点都会有栈顶,所以要用数组而不能用单一变量来标识) (栈顶内容是每次节点变动栈内容唯一变动的,因为按照这道题意一次只变一个,所以保存栈顶就是保存栈的内容) 

              stack[top]=x+1;

              dfs(x+1, y);

              stack[top] = b[top];//还原栈顶内容

              --top;

       }

             

      

       return;

}

 

int main(){

       cin >> n;

       dfs(0, 0);

       return 0;

}

 

标签:出栈,int,top,栈顶,序为例,dfs,还原,节点,字典
From: https://www.cnblogs.com/sujiangzhouzhou/p/17671397.html

相关文章

  • Python 中将键值对(字典)转成数组
    将二维数组转成一维数组data=2D_shuzu().flatten()统计一维数组中重复数字的个数nnn={}.//字典foritemint:ifiteminnnn:nnn[item]+=1else:nnn[item]=1print(nnn)nnn为字典将字典(键值对)转成二位数组data=np.array(list......
  • Python教程(11)——Python中的字典dict的用法介绍
    列表虽然好,但是如果需要快速的数据查找,就必须进行需要遍历,也就是最坏情况需要遍历完一遍才能找到需要的那个数据,时间复杂度是O(n),显然这个速度是很难接受的,于是就必须要有新的数据结构出现,于是字典就诞生了!在Python中,字典(Dictionary)是一种无序的数据结构,用于存储键值对(key-value)。......
  • 重启python-数据类型-字典和集合
    一,字典和集合初始字典:d1={'name':'jason','age':20,'gender':'male'}集合:s1={1,2,3,4,5}二,二者的区别唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。三,内置操作字典:增删改查集合:增删改查注意:集合的pop()操作是删除集合中最后一个元素,可是......
  • python字典中的值为列表
    python字典中的值为列表构造字典,字典中的值为列表。实例:vales=[13,12,11,3,4,5,20,30,31]ex=[0,0,0,1,1,2,2,2]#是对vales的分类结果我们需要将分类结果对应的值,放在一起,由此将使用字典,最为合适,而key就是分类标签,而value则为对应的数据。ex_dic={}for......
  • python中输出字典中值最大或最小的项
     001、输出值最大的项a、>>>dict1={"c":30,"a":40,"b":80,"d":60}##测试字典>>>dict1{'c':30,'a':40,'b':80,'d':60}>>>max_value=max(dict......
  • 01 字典树学习笔记
    01字典树前置知识:字典树。01字典树是一种特殊的字典树,它会把数字看作二进制的\(\texttt{01}\)串存入字符串。在树上,除了叶子节点外的所有节点都表示一个数的范围。我们在插入元素时,和在字典树中插入元素时类似的。这里不再阐述。插入示例代码如下:constintMAXN=2e6......
  • Trie 字典树
    高效地存储和查找字符串集合的数据结构根节点不包含字符,除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符互不相同。通常在实现的时候,会在节点结构中设置一个标志,用来标记该......
  • 链栈的定义、初始化、出栈、入栈等操作
    #include<iostream>usingnamespacestd;/*链栈的定义*/typedefstructsNode{chardata;structsNode*next;}sNode;typedefsNode*linkStack;/*初始化链栈*/voidinitStack_L(linkStack&S){S=newsNode;S->next=NULL;}/*建立一个链栈......
  • 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
     #include<iostream>usingnamespacestd;/*顺序栈的定义*/#defineStack_Size100typedefstructsqStack{char*elem;inttop;intstackSize;//栈数组长度}sqStack;/*顺序栈的初始化*/voidinitStack_Sq(sqStack&S){S.elem=ne......
  • oracle学习笔记(12)——数据库服务器工作模式与数据字典
    1、 专用服务器工作模式    1)概念:       专用服务器模式是指Oracle为每个用户进程启动一个专门的服务器进程,该服务器进程仅为该用户进程提供服务,直到用户进程断开连接时,对应的服务器进程才终止。    2)特点:       服务器进程与客户进......