`

深度优先 - 路径的选择

阅读更多
class PathInfo //数据存储结构
{
	String from;
	String to;
	int distance;
	boolean skip; // used in backtracking

	PathInfo(String f, String t, int d)
	{
		from = f;
		to = t;
		distance = d;
		skip = false;
	}
}

public class Depth
{
	final int MAX = 100;
	PathInfo paths[] = new PathInfo[MAX];
	int pathCount = 0;

	Stack<PathInfo> goInfo = new Stack<PathInfo>();

	public static void main(String args[])
	{
		String from = "", to = "";
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try
		{
			System.out.print("From? ");
			from = br.readLine();
			System.out.print("To? ");
			to = br.readLine();
		} catch (IOException exc)
		{
			System.out.println("Error on input.");
		}

		Depth depth = new Depth();
		depth.setup();
		depth.isOK(from, to);
		depth.route();

	}

	void isOK(String from, String to)// 将可行的路径压栈
	{
		int dist = match(from, to);
		if (dist != 0) // 一站到达
		{
			goInfo.push(new PathInfo(from, to, dist));
			return;
		}

		PathInfo pinfo = findFrom(from);
		if (pinfo != null)
		{
			goInfo.push(new PathInfo(from, to, pinfo.distance));
			isOK(pinfo.to, to); // 直到有“一站到达”

		} else if (goInfo.size() > 0)
		{
			pinfo = (PathInfo) goInfo.pop();// 死路一条
			isOK(pinfo.from, pinfo.to);// 回头再走,成立即可
		}
	}

	void route()
	{
		if (goInfo.size() == 0)
			return;

		int num = goInfo.size();
		Stack<PathInfo> backInfo = new Stack();
		for (int i = 0; i < num; i++)
			backInfo.push(goInfo.pop());// 倒出来,再pop,就是正序了

		int dist = 0;
		PathInfo pinfo = null;
		for (int i = 0; i < num; i++)
		{
			pinfo = (PathInfo) backInfo.pop();
			System.out.print(pinfo.from + " to ");
			dist += pinfo.distance;
		}

		System.out.println(pinfo.to);
		System.out.println("Distance is " + dist);
	}

	// 看能不能直到,能的话,就返回权重,不能返回0
	int match(String from, String to)
	{
		for (int i = pathCount - 1; i > -1; i--)
		{
			if (paths[i].from.equals(from) && paths[i].to.equals(to) && !paths[i].skip)
			{
				paths[i].skip = true; // prevent reuse
				return paths[i].distance;
			}
		}
		return 0;
	}

	// Put flights into the database.
	void addFlight(String from, String to, int dist)
	{
		if (pathCount < MAX)
		{
			paths[pathCount] = new PathInfo(from, to, dist);
			pathCount++;
		} else
			System.out.println("Flight database full.\n");
	}

	// Given from, find any connection.
	// 找到一个起点为from的,并再new一份出来,这段路的条件是未走过。
	PathInfo findFrom(String from)
	{
		for (int i = 0; i < pathCount; i++)
		{
			if (paths[i].from.equals(from) && !paths[i].skip)
			{
				PathInfo pinfo = new PathInfo(paths[i].from, paths[i].to, paths[i].distance);
				paths[i].skip = true; // prevent reuse
				return pinfo;
			}
		}
		return null;
	}

	// Initialize the path database.
	// 地图是有限的,每个点周边相邻的点,两两成一直线,且是有方向性的
	// 查找的时候,数据的分布,会影响结果
	public void setup()
	{
		databaseGen();
	}

	private void databaseGen()
	{
		addFlight("A", "B", 500);
		addFlight("A", "D", 900);
		addFlight("A", "C", 1800);
		addFlight("A", "J", 700);
		addFlight("J", "K", 300);

		addFlight("B", "A", 1700);
		addFlight("B", "F", 1700);
		// addFlight("B", "H", 600);
		addFlight("B", "D", 500);

		addFlight("C", "G", 1000);
		addFlight("C", "E", 1000);
		addFlight("C", "H", 1000);

		addFlight("D", "C", 1000);
		addFlight("E", "H", 1500);
	}

	private void databaseGood() // 最理想的情况,A to B
	{
		addFlight("A", "B", 500);
	}

	private void databaseLong()// 不理想的数据分布, A to J
	{
		addFlight("A", "B", 1500);
		addFlight("A", "I", 1500);
		addFlight("I", "J", 1500);

		addFlight("B", "C", 1500);
		addFlight("B", "A", 1500);

		addFlight("C", "D", 1500);
		addFlight("C", "B", 1500);
		addFlight("D", "C", 1500);
	}

	private void databaseLong2()// 不理想的数据分布, A to J
	{
		addFlight("A", "B", 1500);
		addFlight("A", "I", 1500);
		addFlight("I", "J", 1500);

		addFlight("B", "A", 1500);// --
		addFlight("B", "C", 1500);// --

		addFlight("C", "B", 1500);// --
		addFlight("C", "D", 1500);// --

		addFlight("D", "C", 1500);
	}

}



数据存储特征:
一、上面的地图数据结构,映射为二维表。
二、起点集合性(就是from集在一起)
三、from按A->Z,to 是A->Z 或 Z->A

数据查找特征:
一、深度优先,如果是二维表的角度来说是,从左到右,从上至下。

查找优化:
一、将from分成块,那就能加快from的查找;
二、较短路径:
    1、先得到起点与终点的直线距离X值,再由X经某种公式得到K值。
    2、查找时判断时,排除权值大于K的



飞机就是典型、理想的点对点模型,
汽车的GPS导航就更复杂了,有路径最短、最省钱、最快速的

分享到:
评论

相关推荐

    基于深度优先寻路的路径规划算法

    深度优先寻路算法(Depth-First Search,DFS)是一种在图或树中寻找路径的经典算法,广泛应用于路径规划、网络爬虫、迷宫求解、图的染色等问题。其核心思想是尽可能深地探索图的分支,直到达到目标节点或者回溯到...

    基于深度优先搜索(DFS)的路径规划算法(Python实现)

    深度优先搜索(DFS)是一种常用的图遍历算法,用于寻找图中的路径。它从起始节点开始,沿着一条路径尽可能深入地探索,直到无法继续为止,然后回溯到上一个节点,继续探索其他路径。DFS的核心原理是通过递归或栈的...

    深度优先搜索求最短路径

    在类似于迷宫的地图上,采用深度优先搜索的策略(递归回朔)计算从起始点到目标点之间的一条最短路径。

    利用深度优先搜索求出最短路径包括所有路径

    深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,尽可能深地探索图的分支,直到达到目标节点或无法继续深入时,才会回溯到上一步,尝试其他路径。在这个过程中...

    航线选择_航线深度优先_航线选择_深度遍历算法_

    航线选择和深度优先搜索(DFS,Depth First Search)在计算机科学和信息技术领域是常见的问题解决策略,特别是在图论和算法设计中。深度优先搜索是一种用于遍历或搜索树或图的算法,它沿着树的深度尽可能深地搜索,...

    深度优先搜索迷宫路径

    迷宫路径的深度优先搜索算法的C语言简单实现,迷宫用二位数组存储

    走迷宫-----深度优先算法

    在实际应用中,深度优先搜索可以应用于更广泛的场景,如网络路由、游戏AI路径规划、电路板布线等,体现了其强大的通用性和实用性。对于对算法感兴趣的学习者来说,掌握深度优先搜索及其变体是一项宝贵的技能。

    java 深度优先遍历、广度优先遍历、最短路径、最小生成树

    本文将深入探讨Java中实现的四个核心图算法:深度优先遍历(DFS)、广度优先遍历(BFS)、最短路径算法以及最小生成树算法。 首先,**深度优先遍历(DFS)**是一种用于遍历或搜索树或图的算法。它从根节点开始,尽...

    图的存储结构(邻接表或邻接矩阵),的深度优先搜索遍历路径。

    要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。

    八数码的深度优先算法c++实现

    人工智能的八数码的深度优先算法c++实现

    深度优先搜索遍历路径

    在图的深度优先搜索中,我们通常从一个起始节点开始,沿着某条边向下探索,直到到达一个未访问过的节点,然后回溯到上一个节点,选择另一个未访问过的邻接节点继续探索。这个过程一直持续到所有可达节点都被访问或者...

    种子填充算法-深度优先搜索

    深度优先搜索的核心思想是从起点开始,沿着某条路径一直探索到不能再前进为止,然后回溯到上一步,再选择另一条路径继续探索。在种子填充中,每个像素点可以视为图中的一个节点,相邻的像素则表示节点间的边。当应用...

    基于深度优先搜索和广度优先搜索的最短路径问题

    该代码解决了最短路径问题(给定带权有向图G=(V, E),对任意顶点vi,vj∈V(i≠j),求顶点vi到顶点vj的最短路径...代码使用了广度优先搜索和深度优先搜索;枚举法、回溯法来解决最短路径问题,其中结果存储使用文件。

    MATLAB实现迷宫的递归深度优先遍历算法

    深度优先遍历是一种图遍历策略,特别适合解决寻找路径的问题,如在迷宫中找到从起点到终点的所有可能路径。 首先,我们要理解迷宫可以被抽象为一个二维矩阵,其中0代表可通行的路径,1代表障碍物。DFS算法的基本...

    深度优先搜索.docx

    2. 最短路径问题:深度优先搜索算法可以用来解决最短路径问题,即找到从起点到终点的最短路径。 3. 图的连通性:深度优先搜索算法可以用来判断图的连通性,即判断图中是否有路径连接所有点。 4. 图的拓扑排序:深度...

    基于深度优先搜索的最短路径问题

    本示例聚焦于利用深度优先搜索(DFS, Depth-First Search)解决带权有向图中任意两点间的最短路径问题。深度优先搜索是一种在图或树结构中进行遍历的算法,它尽可能深地探索节点的子树,直到找到目标节点或遍历完...

    76、不撞南墙不回头--深度优先搜索(2020.02.12)-A.pdf

    在给定的问题中,深度优先搜索算法通过递归回溯法框架,实现对图中所有可能路径的遍历,直到找到所需的解或遍历完所有路径为止。下面详细说明深度优先搜索算法在C++语言中的实现,以及相关的知识点。 深度优先搜索...

    深度优先最短路问题

    深度优先搜索在解决最短路径问题时,通常会计算所有可能的路径并记录下最短的。这种方法在图的规模较小或者路径长度不那么重要的情况下适用。然而,对于大规模图和需要高效求解最短路径的情况,BFS通常更优,因为它...

    这是一个基于实时路况的出行路径规划实现,里面包含了预测原数据,预测算法实现和路径规划实现,路径规划算法使用了深度优先算法改进

    本项目实现了这样一个系统,它基于实时路况,通过预测算法预估交通状态,并利用深度优先算法的改进版进行路径规划,旨在提供最佳的出行建议。以下是这个系统的关键知识点详解: 1. 实时路况预测:预测原数据是整个...

    图的深度优先和广度优先搜索动态演示图3张

    图的深度优先搜索(DFS, Depth-First Search)和广度优先搜索(BFS, Breadth-First Search)是图论中的两种基本遍历算法,它们在计算机科学中有着广泛的应用,例如在解决网络爬虫、迷宫求解、社交网络分析等问题时。...

Global site tag (gtag.js) - Google Analytics