dfs,,类似树的想法

图的深度优先搜索算法并生成DFS树 前面一篇文章介绍了图的广度优先搜索算法和BFS树,这篇文件笔者将介绍另一种图的遍历算法-深度优先算法概述深度优先搜索(Depth-First Search,DFS)选取下一顶点的策略,可概括为:优先选取最后一个被访问到的顶点的邻居。以顶点 s 为基点的 DFS 搜索,将首先访问顶点 s;再从 s 所有尚未访问到的邻居中任取其一,并以之为基点,递归地执行 DFS 搜索。 阅读详情

P - FatMouse and Cheese

  HDU - 1078 

看了是dfs。但是自己写的时候没有按照那个写。。

而且题目还没看好。他是只能水平或垂直,不能再转向了。。

别人ac代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int n,k,dp[105][105],a[105][105];
int to[4][2] = {1,0,-1,0,0,1,0,-1};

int check(int x,int y)
{
    if(x<1 || y<1 || x>n || y>n)
        return 1;
    return 0;
}

int dfs(int x,int y)
{
    int i,j,l,ans = 0;
    if(!dp[x][y])
    {
        for(i = 1; i<=k; i++)
        {
            for(j = 0; j<4; j++)
            {
                int xx = x+to[j][0]*i;
                int yy = y+to[j][1]*i;
                if(check(xx,yy))
                    continue;
                if(a[xx][yy]>a[x][y])
                    ans = max(ans,dfs(xx,yy));
            }
        }
        dp[x][y] = ans+a[x][y];
    }
    return dp[x][y];
}

int main()
{
    int i,j;
    while(~scanf("%d%d",&n,&k),n>0&&k>0)
    {
        for(i = 1; i<=n; i++)
            for(j = 1; j<=n; j++)
                scanf("%d",&a[i][j]);
        memset(dp,0,sizeof(dp));
        printf("%d\n",dfs(1,1));//他的dp[i][j]表示从(ii,j)走得到的maxx,算是一种逆向思维吧,而且因为dfs(1,1)是确定的。这更像是一种树的结构。
    }

    return 0;
}
自己的TLE代码。  没有什么参考价值吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
const int maxn=105;
int a[maxn][maxn];
int dp[maxn][maxn];
int n,k;
void dfs(int x,int y){//对于每一个点都找出它的上一个。
    int tmpu=max(0,x-k),tmpd=min(n,x+k+1);
    for(int i=tmpu;i<tmpd;++i){
        int tmpl=max(y-k,0),tmpr=min(n,y+k+1);
        for(int j=tmpl;j<tmpr;++j){
            if(abs(x-i)+abs(y-j)<=k){
                if(dp[i][j]<dp[x][y]+a[i][j]&&a[i][j]>a[x][y]){
                    dp[i][j]=dp[x][y]+a[i][j];
                    dfs(i,j);
                }
                /*
                if(dp[i][j]+a[x][y]>dp[x][y]&&a[i][j]<a[x][y]){
                    dfs(i,j);
                    dp[x][y]=dp[i][j]+a[x][y];
                }
                */
                /*  反正由前一个状态到这个状态是不可以的
                if(dp[i][j]+a[x][y]>dp[x][y]){
                    dp[x][y]=dp[i][j]+a[x][y];
                }
                */
                /*
                if(dp[i][j]<dp[x][y]+a[i][j]&&a[i][j]>a[x][y]){
                    dp[i][j]=dp[x][y]+a[i][j];
                }*///有当前推后面也不可以
            }
        }
    }
}
void init(){
    memset(dp,0,sizeof(dp));
}
int main(){
    while(~scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){
        init();
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                scanf("%d",&a[i][j]);
            }
        }
        /*
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cout<<a[i][j]<<' ';
            }
            cout<<'\n';
        }*/
        dp[0][0]=a[0][0];
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                dfs(i,j);
            }
        }
        for(int i=n-1;i>=0;--i){
            for(int j=n-1;j>=0;--j){
                dfs(i,j);
            }
        }
        /*
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                dfs(i,j);
            }
        }
        for(int i=n-1;i>=0;--i){
            for(int j=n-1;j>=0;--j){
                dfs(i,j);
            }
        }*/
        int maxx=0;
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                maxx=max(maxx,dp[i][j]);
            }
        }
        /*
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cout<<dp[i][j]<<' ';
            }
            cout<<'\n';
        }*/
        cout<<maxx<<'\n';
    }
}



10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径 @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,... 阅读详情

相关推荐

【数据结构与算法】图的遍历(深度优先遍历DFS算法)

1.1深度优先遍历 深度优先遍历(depth first search),也有称为深度优先搜索简称DFS。它的主要思想就是例如找钥匙一样。例如:我们的一把车钥匙被搞丢了但是可以确定的是它一定就在家里的某个位置,所以我们需要从房间开始寻找,可是我们是该在房间某一处寻找还是将一整个房间搜索完之后再找其他房间的地方呢?在深度优先遍历意思就是将一个房间的所有地方搜索完之后再进行其他房间的搜索,直至找到车钥匙为止。 假设你现在需要完成一个任务,要知道你在如下迷宫中,从顶点A开始要走遍所有图中的顶点并作上标记,注.

m0_61886762的博客 9996

图的深度优先(DFS)和广度优先(BFS)遍历

图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历 图的广度优先搜索遍历(DFS)类似于树的层次遍历 #include<stdio.h> #include<iostream> #define maxsize 20 using namespace std; //表结点 typedef struct ArcNode { int adjvex; //该边指向的结点位置 struct ArcNode* nextarc; //指向下条边的指针 int info; //存储边的相关

theonepiece的博客 1401

深度优先算法DFS入门 (超级简单的例题入门)

参考文章: 1、Leetcode Subset I & II 作者:算法鱼 (里面是java版本的代码) 一、什么是 DFS? 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 具体做法是:假设初始状态是图中所有顶点均未被访问,则从某个顶点V出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被...

刷刷刷,刷Leetcode 1455

图的遍历(DFS和BFS)

NextAdjVex(G,v,w)除了第一个不为0的下一个不为0的如果是邻接表(由表头数组构成的多个单链表,FirstAdjVex(G,v)其中v就是表头,在表头数组中寻找到v,这样就找到了这个单链表, 单链表中的边结点都是该顶点的邻接点,表头的firstarc指针域就是该顶点的第一个邻接点,每个边结点的nextarc是下一个邻接点。和树的通历类似,图的遍历也是从图中某一顶点出发,按照某种方选对图中所有演道进行图的遍历算法是求解图的连通性问题、拓扑排序和关键路径等算法的基础——它们对无向图和有向图都适用。

m0_74124886的博客 1340

深度优先算法思想

深度优先算法思想 深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始点,则深度优先搜索递归调用包含以下操作: (1)访问搜索到的未被访问的邻接点; (2)将此顶点的visited数组元素值置1; (3)搜索该顶点的未被访问的邻接点,若该邻接点存在,则从此邻接点开始进行同样的访问和搜索。 深度优先搜索DFS可

basycai的博客 2811

langchain4j+milvus实战

本文主要研究一下如何使用langchain4j来对接向量数据库milvus。

go4it 1474

深度优先遍历(DFS)和广度优先遍历(BFS)

深度优先遍历和广度优先遍历1.深度优先遍历(DFS)2.广度优先遍历(BFS)3.DFS与BFS算法比较 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth First Search),它们是遍历图当中所有顶点的两种方式。 1.深度优先遍历(DFS) 深度优先遍历顾名思义就是一条路走到黑,再寻其他未走过的路。其类似于树的先序遍历。 思想: 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优

weixin_45666566的博客 4730

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2863

图的遍历(详解DFS与BFS)

详解DFS和BFS的方法和具体实现,包括邻接矩阵和邻接表两种数据结构

CXR_XC的博客 1万+

Python爬虫实战:抓取天气数据并生成可视化图表(完整可复制代码)

工具/库核心作用选型理由requests发送HTTP请求,获取天气网页内容语法简单,上手快,支持Headers配置(反爬)解析HTML页面,提取目标天气数据无需懂复杂XPath,API直观,快速定位标签pandas数据清洗、整理(如日期/温度格式化)一键处理数据格式,与matplotlib无缝适配matplotlib生成可视化图表(折线图/饼图/柱状图)Python主流可视化库,定制性强,支持保存高清图生成随机User-Agent,应对反爬自动更新UA池,避免手动维护。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 909

【软路由】旁路由使用配置教程

【软路由】旁路由使用配置教程简介旁路由好处旁路由配置步骤1、修改管理地址网段 简介 我们都知道,软路由一般有两种使用方式,一种是作为承担DHCP分配的主路由,而另一种就是作为不承担DHCP分配功能的旁路由使用。今天就来介绍如何将软路由配置成为旁路由。 旁路由好处 旁路由最大的好处就是它不承担DHCP分配任务,这意味着它的对网络的影响极小。即使突然故障也不会导致整个网络瘫痪。更别提软路由的配置复杂,用户可能还经常修改上面的网络配置,一旦出错就是整个网络瘫痪,如果家中还有其他人使用网络,影响实在是不好。 建议有

博客 4万+

为什么说图的深度遍历类似于树的先序遍历?

DFS递归实现与树的先序遍历递归实现的相似处 在考研复习时复习到图的深度遍历时,参考书中有一句话———图的DFS遍历类似于树的先序遍历,书中给的DFS遍历是以递归方式实现的,于是作者贴出了树的先序遍历的递归代码让读者互相比较,确实可以看出一些相似之处,那就是二者算法思想其实都是,先访问根结点(图中是DFS遍历的起始点),然后递归处理它们的“子部分”,图中的“子部分”指的是这个顶点的其余邻接点,树中的这个“子部分”则是结点的左右子树。 DFS非递归遍历与树的先序遍历非递归实现的相似处 通过对两种算法的递归实

一只向入研坑的程序猿 3124

手把手教你用STM32CubeIDE移植Vector CCP驱动,实现与INCA的标定通信(附避坑指南)

本文详细介绍了如何在STM32CubeIDE环境下移植Vector CCP驱动,实现与INCA的标定通信。从开发环境准备、CAN外设配置到CCP协议栈移植和A2L文件生成,提供了完整的操作流程和常见问题解决方案,帮助工程师快速掌握基于CAN总线的标定技术。

weixin_28685287的博客 139

【算法笔记】深度优先算法DFS(保姆级教学,一篇让你搞懂DFS的精髓)

本文章介绍了搜索算法中常用的DFS深度优先算法,它的核心思想是从一个起点开始,沿着一个方向尽可能深地搜索,直到无法继续为止,然后回溯到上一个节点,继续沿着其他方向搜索。DFS可以使用递归或栈(非递归)来实现。

weixin_74297512的博客 6527

矢量量化的基本原理:高效数据压缩与信息检索的关键矢量量化(Vector Quantization,简称VQ)是一种数据压缩和信

此外,在矢量量化过程中,可能会引入一定的信息损失,对一些精细特征的表示可能存在一定的误差。它通过将高维数据映射到低维码本空间中,并将相似的数据映射到相同的码本向量中,实现对数据的高效表示和存储。最重要的是,矢量量化可以用于数据的检索和分析,提供了高效的数据查询和处理手段。通过使用码本索引,我们可以高效地存储和检索大量的数据。在图像处理中,矢量量化可以用于图像压缩,将复杂的图像数据转化为较少的码字,实现图像的存储和传输。矢量量化通过将连续的高维数据分割并映射到有限的码本集合中,实现数据的离散表示和压缩。

m0_70886513的博客 1373

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

深度优先算法DFS(Depth First Search)

不撞南墙不回头。

Iamme 1万+

AutoSAR配置与实践(基础篇)3.2 BSW中的I/O架构和模块详解

车门位置传感器(Sensor SWC)输出的电流信号经过了一系列处理,如先被转化为电压信号,后又经ADC转换为数字信号,但是IoHwAb模块对上层隐藏了这一系列处理过程,并将数据直接抽象为它的输出接口,即车门开关状态接口。Sensor SWC 使用RTE接口直接从IoHwAb模块封装的车门开关状态,SWC它并不关心ECU硬件是如何实现的传感器电流采集,也不关心MCU ADC采样精度(如10/12位)IoHwAb把采集的电压抽象为开关状态,使得Sensor SWC不依赖具体的ECU硬件。

nihaoljq2010的博客 1300

深度优先算法(DFS)和广度优先算法(BFS)

DFS和BFS介绍

愿你我都能实现自己的梦想 4707

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【DFS】深度优先搜索递归方式讲解

前言 记得第一次接触到DFS还是在去年大概三四月份,当时也是在准备比赛的时候听说DFS很重要(原谅我是个小白),然后就去Google了一波什么叫做DFS,当时的我刚开始学习C++,还没有学习数据结构,讲道理当时我看懂了算法原理,但是对于什么图呀,树呀的还真是一窍不通。后边学习了数据结构后,对于DFS原理也是相当的了解(自我感觉),但从来没有总结过,今天主要是进行DFS的算法进行简单的自我总结,一...

仰起嘴角 4万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深度优先算法和广度优先算法

在数据结构中,树和图可以说是不可或缺的两种数据结构。其中,对于图来说,最重要的算法可以说就是遍历算法。而搜索算法中,最标志性的就是深度优先算法和广度优先算法。图的定义普遍为两种,一种是邻接表,另一种是邻接矩阵。图的邻接矩阵表示是唯一的,但对于邻接表来说,若边的输入次序不同生成的邻接表也不同。因此,对于同一个表,基于邻接矩阵的遍历所得到的BFS序列和DFS序列是不唯一的,基于邻接表的遍历所得到的BFS和DFS是唯一的。...

4445

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【数据结构】一文吃透深度优先算法:原理、实现与应用

        深度优先算法作为一种基础且强大的搜索算法,以其独特的深度优先探索和回溯机制,在树和图的遍历以及众多实际问题的解决中发挥着关键作用 。我们深入剖析了它的核心思想,详细介绍了在二叉树和图中的实现方式,包括递归和非递归(栈实现)两种方法,并通过丰富的实际应用场景,如迷宫问题求解、拓扑排序和八皇后问题,展示了其广泛的适用性和强大的功能。同时,我们也全面分析了它的优缺点,使大家对其性能有了更清晰的认识。

大雨淅淅的博客 2112

C++数据结构-图的遍历:DFS深度优先及广度优先详解

DFS(Depth-First-Search,深度优先搜索)算法的具体做法是:从某个点一直往深处走,走到不能往下走之后,就回退到上一步,直到找到解或把所有点走完。在实现这一个依次的访问顺序时,操作动作存储与数据结构(栈)的思想及其相似,同时也由于栈的性质,我们可以通过递归来简化栈的创建,因此DFS算法的两种做法分别时利用栈或者递归实现。算法步骤(递归或栈实现)a)访问指定起始地点。b)若当前访问顶点的邻接顶点有未被访问的顶点,就任选一个访问。

Dola的博客 4031

深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先和广度优先是在图和树的遍历搜索中比较常用的搜索方法 深度优先 算法简介 DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等.

段一的博客 6万+

深度优先算法(DFS)的python实现及骑士周游问题解析

背景: 骑士周游问题 在棋盘格里,马走日,遍历所有网格点,找到每个网格都走过,且只有一次的路径。 算法实现: 用于解决骑士周游问题的图搜索算法是深度优先搜索(DFS),该算法是逐层建立搜索树,沿着树的单支尽量深入的向下搜索。连接尽量多的顶点,必要时可以进行分支。 深度优先搜索同样要用到顶点的“前驱”属性,来构建树或森林。另外需要设置“发现时间”和“结束时间”属性。 发现时间是在第几步访问到了这个顶点(设置灰色);结束时间是在第几步完成了此顶点的探索(设置黑色)。 通用的深度优先搜索算法代码: # BFS采

cy15625010944的博客 3656

深度优先算法-DFS(算法篇)

本文将会讲解一种常用的搜索算法,叫做深度优先算法dfs,也常用于算法题中。在最短路径中我们讲了广度优先算法bfs,而没讲是因为dfs并没有最短性

hellmorning的博客 728
上一篇: cf 758 B. Blown Garland模拟
下一篇: hdu3535
sega_handsome
博客等级 码龄10年 7粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值