首页 > 其他分享 >【DFS深度优先遍历】给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数

【DFS深度优先遍历】给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数

时间:2023-11-30 16:57:53浏览次数:30  
标签:std 遍历 数组 int DFS len way oneend

题目描述

给定一个数组,从第一个开始,正好走到数组最后,所使用的最少步骤数。

要求:
第一步从第一元素开始,第一步小于<len/2(len为数组的长度)。从第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少, 如果目标不可达返回-1,输出最少的步骤数,不能往回走。

输入
7 5 9 4 2 6 8 3 5 4 3 9
输出
2

输入
1 2 3 7 1 5 9 3 2 1
输出
-1

输入
7, 1, 1, 1, 1, 2, 1, 2, 3, 2, 1, 9
输出
4

思路

思路一:从前往后,因为第一步小于<len/2,所以先把从第0到len/2-1步放入路径,然后从这些路径往后走,第一个达到终点的则为最短。

思路二:从后往前,找到所有前面能走到终点的点,放入可到达位置,然后又从以刚刚找到的可达路径为终点,找到前面能走到当前终点的所有可达位置,直到走到小于len/2的位置,当前走的步数就是最短步数。

方案一二对比:方案一在每一步走的时候,在未达终点前,都不会移除无效数据,方案二在每一次走的时候其实都会筛选掉一些到不了当前位置的点,越算越快。但是具体没有细研究。

我采用的是方案二思路

void ReachDest(std::vector<int>& way)
{
	int step = 0;
	std::vector<int> allend(1, way.size() - 1);
	int len = way.size();
	while (true)
	{
		std::vector<int> newend;
		++step;
		for (auto oneend : allend)
		{
			for (int i = oneend - 1; i >= 0; --i)
			{
				if (oneend - i == way[i])
				{
					if (i < len/2)
					{
						std::cout << ++step << std::endl;
						return;
					}
					newend.push_back(i);
				}
			}
		}
		if (newend.empty())
			break;
		allend = newend;
	}

	std::cout << -1 << std::endl;
}

标签:std,遍历,数组,int,DFS,len,way,oneend
From: https://www.cnblogs.com/zhonglimo/p/17867752.html

相关文章

  • 枚举类的values()方法 枚举类有一个values()方法,这个方法可以将枚举类转换成一个枚举
    枚举类的values()方法枚举类有一个values()方法,这个方法可以将枚举类转换成一个枚举类型的数组,转换成数组之后我们就可以通过下标来访问我们的枚举类中的值枚举类中的元素是无法通过下标值来访问的,如果你想指定访问枚举类中的某个值,你只能直接写出它们的值,除此之外,别无他法。但......
  • [转载]C/C++ 遍历窗口标题类名
    原地址:https://cloud.tencent.com/developer/article/2201930遍历每个进程,一次查找进程下的窗口,找到窗口标题为“”,窗口类名为“RunDll”的窗口。如果找到返回true,没找到返回false。#pragmaregion依赖typedefstructEnumHWndsArg{std::vector<HWND>*vecHWnds......
  • 如何理解C语言中“数组名就是指针”
    定义一个数组:inta[5]={1,2,3,4,5};访问元素5可以通过以下形式的代码:a[4];/*下标运算符,可理解为数组的访问形式*/*(a+4);/*指针的加法运算和解引用,可理解为指针的引用形式*/实际上这两种访问形式是等价的,即X[m]=*(X+m)这里不妨再拓展一下,根据加法交换律,交换两个加数的......
  • day1数组理论基础,704. 二分查找,27. 移除元素
    数组理论基础,704.二分查找,27.移除元素1数组理论基础1.1数组概念定义:存放在连续内存空间上的相同类型数据的集合。特点:1.数组中数据类型相同2.数组所占空间连续1.2数组创建2704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数......
  • 算法刷题记录-数组之和
    算法刷题记录-数组之和四数相加Ⅱ给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,......
  • 数组
      ......
  • 分布式系统HDFS
    1、完全分布式搭建hadoop102[namenode,datanode],hadoop103[datanode],hadoop104[secondarynamenode,datanode]缺少104,配置104选择完全克隆103机器的名称hadoop104配置机器的IP192.168.18.104修改vim /etc/sysconfig/network-scripts/ifcfg-ens33重启⽹络......
  • 【DFS深度优先算法】全排列、组合总和
    全排列题目描述:给定一个没有重复数字的序列,返回其所有可能的全排列。题目链接:46.全排列输入描述:输入:[1,2,3]输出描述:输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:依次从前往后把所有数字,固定在第0个位置,此时再从前往后把剩余数字依次固定在第1个位置,如此......
  • 二、HDFS的读写流程
    一、写数据(宏观)  写数据就是将客户端上的数据上传到HDFS 1.客户端向HDFS发送写数据请求 hdfsdfs-putstudents.txt/shujia/ 2.Filesystem通过rpc调用namenode的put方法 a.nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限......
  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写应用......