求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离;

图中有数字的点表示为图中的不同海拔的高地,不能通过;没有数字的点表示海拔为0,为平地可以通过;

这个是典型的求图中两点的最短路径;本例,用深度优先算法来实现;

在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况;

深度优先算法函数怎么写?

也就是写递归函数。。。但是递归函数肿么写???

第一:判断初始态,从起点出发,刚开始步数为0;dfs(start_x, start_y, 0);

第二:从起点出发,要做什么事情?尝试四个方向的走法。

在每个方向上要什么?先判断这个点是否到达边界,再判断这个点是否走过并且是否是高地;如果不是高地也没有走过,则再从该点出发,做和之前的点一样的事情;

dfs(tx, ty, step+1);

第二:判断终止条件,到达终点,判断当前步数;返回;

/*************************************************************************
> File Name: search_min_step.cpp
> Author:
> Mail:
> Created Time: 2015年11月13日 星期五 21时49分41秒
************************************************************************/ #include<iostream> using namespace std; const int MAX_X = 50;
const int MAX_Y = 50;
int min_step = 10000;
int my_x, my_y;
int map[MAX_X][MAX_Y];
int book[MAX_X][MAX_Y];
int start_x, start_y;
int dest_x, dest_y; void dfs(int x, int y, int step)
{
/*up, right, down, left*/
int next[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
int tx, ty; if (x == dest_x && y == dest_y){
if (step < min_step)
min_step = step;
return;
} for (int i = 0; i < 4; i++){
tx = x + next[i][0];
ty = y + next[i][1];
if (tx > my_x || ty > my_y || tx < 0 || ty < 0)
continue; if (map[tx][ty] == 0 && book[tx][ty] == 0){
book[tx][ty] = 1;
dfs(tx, ty, step+1);
book[tx][ty] = 0;
}
} }
void input_map_info()
{
cout << "input the max x:";
cin >> my_x;
cout << "input the max y:";
cin >> my_y; cout << "input the map information:\n";
for (int i = 1; i <= my_x; i++){
for (int j = 1; j <= my_y; j++){
cin >> map[i][j];
}
}
} int main()
{
input_map_info(); cout << "input the source location:";
cin >> start_x >> start_y;
cout << "input the destat location:";
cin >> dest_x >> dest_y; book[start_x][start_y] = 1;
dfs(start_x, start_y, 0); cout << "min_step = " << min_step << endl; return 0;
}

在图中寻找最短路径-----深度优先算法C++实现的更多相关文章

  1. 图结构练习——最短路径(dijkstra算法(迪杰斯拉特))

      图结构练习——最短路径 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   ...

  2. Expm 4_2 有向无环图中的最短路径问题

    [问题描述] 建立一个从源点S到终点E的有向无环图,设计一个动态规划算法求出从S到E的最短路径值,并输出相应的最短路径. 解: package org.xiu68.exp.exp4; import j ...

  3. Expm 4_1 多段图中的最短路径问题

      [问题描述] 建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径. 解 package org.xiu68.exp.exp4; public cl ...

  4. SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)

    图结构练习——最短路径 Time Limit: 1000 ms            Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  5. 同步图计算实现最短路径Dijkstra算法

    同上篇讲述pageRank一样,考虑一个顶点V. 根据顶点算法通常步骤1) 接收上个超步发出的入邻居的消息2) 计算当前顶点的值3) 向出邻居发消息 1.接收入邻居的消息 2.求入邻居的最小值,加上顶 ...

  6. 寻找最短路径Dijkstra算法

    1 /** 2 * 1.对于T中的每个顶点u,找到u的具有最小权重的连接边.所有到u的连接边都存储在queues.get(u)中.queues.get(u).peek()返回拥有最小权值 3 * 的连 ...

  7. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  8. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  9. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

随机推荐

  1. 5、Spring Boot 2.x 启动原理解析

    1.5 Spring Boot 启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏 ...

  2. SIGAI机器学习第七集 k近邻算法

    讲授K近邻思想,kNN的预测算法,距离函数,距离度量学习,kNN算法的实际应用. KNN是有监督机器学习算法,K-means是一个聚类算法,都依赖于距离函数.没有训练过程,只有预测过程. 大纲: k近 ...

  3. P4310 绝世好题 按位DP

    这名字可海星\(OvO\) 思路:\(DP\) 提交:2次(\(zz\)我竟然把三目运算符写错了\(QwQ\)) 题解: 按位进行\(DP\):\(f[i]\)表示结尾的数字包括\(1<< ...

  4. @Async 异步注释 @EnableAsync

    @SpringBootApplication @ComponentScan(basePackages = "com.fddsfsg") //@EnableSwagger2 @Ena ...

  5. c实现双向链表

    实现双向链表:创建.插入.删除 #include <iostream> #include <stdio.h> #include <string.h> #includ ...

  6. MySQL备忘点(上)

    给自己看的,所以以举例子为主了 检索数据 SELECT 检索单列 SELECT name FROM student 检索多列 SELECT no, name FROM student  检索所有列 S ...

  7. 用docker 下载NGINX nginx安装错误:No package nginx available

    docker 内安装 nginx,提示 解决方案: 1,备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.rep ...

  8. 5.3.3 自定义writable和RawComparatorWritable

    5.3.3 自定义writable (1)构造员工writable Hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很多事情,但是如果你想构造一些更加复杂的结果,你 ...

  9. 使用sequelize-auto 生成mysql 表的实体时主键没有 autoIncrement: true 属性

    使用sequelize-auto 生成mysql 表时主键没有 autoIncrement: true 属性,这会导致插入数据时报错.看git上面是已经解决了的,解决方法是修改查询语句模板.我用的是0 ...

  10. 如何永久激活(破解) IntelliJ IDEA 2018.2.2

    原 如何永久激活(破解) IntelliJ IDEA 2018.2.2 版权声明:本文为博主原创文章,转载不需要博主同意,只需贴上原文链接即可. https://blog.csdn.net/zhige ...