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

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

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

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

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

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

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

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

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

dfs(tx, ty, step+1);

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

  1. /*************************************************************************
  2. > File Name: search_min_step.cpp
  3. > Author:
  4. > Mail:
  5. > Created Time: 2015年11月13日 星期五 21时49分41秒
  6. ************************************************************************/
  7.  
  8. #include<iostream>
  9.  
  10. using namespace std;
  11.  
  12. const int MAX_X = 50;
  13. const int MAX_Y = 50;
  14. int min_step = 10000;
  15. int my_x, my_y;
  16. int map[MAX_X][MAX_Y];
  17. int book[MAX_X][MAX_Y];
  18. int start_x, start_y;
  19. int dest_x, dest_y;
  20.  
  21. void dfs(int x, int y, int step)
  22. {
  23. /*up, right, down, left*/
  24. int next[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
  25. int tx, ty;
  26.  
  27. if (x == dest_x && y == dest_y){
  28. if (step < min_step)
  29. min_step = step;
  30. return;
  31. }
  32.  
  33. for (int i = 0; i < 4; i++){
  34. tx = x + next[i][0];
  35. ty = y + next[i][1];
  36. if (tx > my_x || ty > my_y || tx < 0 || ty < 0)
  37. continue;
  38.  
  39. if (map[tx][ty] == 0 && book[tx][ty] == 0){
  40. book[tx][ty] = 1;
  41. dfs(tx, ty, step+1);
  42. book[tx][ty] = 0;
  43. }
  44. }
  45.  
  46. }
  47. void input_map_info()
  48. {
  49. cout << "input the max x:";
  50. cin >> my_x;
  51. cout << "input the max y:";
  52. cin >> my_y;
  53.  
  54. cout << "input the map information:\n";
  55. for (int i = 1; i <= my_x; i++){
  56. for (int j = 1; j <= my_y; j++){
  57. cin >> map[i][j];
  58. }
  59. }
  60. }
  61.  
  62. int main()
  63. {
  64. input_map_info();
  65.  
  66. cout << "input the source location:";
  67. cin >> start_x >> start_y;
  68. cout << "input the destat location:";
  69. cin >> dest_x >> dest_y;
  70.  
  71. book[start_x][start_y] = 1;
  72. dfs(start_x, start_y, 0);
  73.  
  74. cout << "min_step = " << min_step << endl;
  75.  
  76. return 0;
  77. }

在图中寻找最短路径-----深度优先算法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. Codeforces Round #584 B. Koala and Lights

    链接: https://codeforces.com/contest/1209/problem/B 题意: It is a holiday season, and Koala is decoratin ...

  2. WSDL的学习

    1.WSDL是什么? 2.wsdl说明书结构 拿到说明书,从下往上看, 图2-1 port:为端点 binding:绑定 图2-2 type属性----->找到portType标签 operat ...

  3. 数据结构实验之数组三:快速转置(SDUT 3347)

    Problem Description 转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它 ...

  4. Python学习日记(七)——装饰器

    1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print ' ...

  5. Redis使用Docker镜像安装

    详细见本人以下文档: https://www.cnblogs.com/zyc-blogs/p/9621727.html

  6. Jmeter Web 性能测试入门 (五):Jmeter 参数化 Request

    用来参数化的常用方法: 添加配置元件:用户定义的变量 使用函数助手 添加配置元件:CSV Data Set Config 添加前置处理器:BeanShell PreProcessor 添加配置元件:用 ...

  7. HTTP之缓存

    1. 保持副本的新鲜 HTTP 有一些简单的机制可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下,保持已缓存数据与服务器数据之间充分一致.HTTP 将这些简单的机制称为文档过期(document ...

  8. legend3---13、vue是真的好用

    legend3---13.vue是真的好用 一.总结 一句话总结: 下次前端所有的交互页面都可以用vue 1.chrome查看post请求携带的参数? 请求的Headers里面的Form Data里面 ...

  9. 使 nodejs 代码 在后端运行(nohup)

    1.代码 nohup node server.js & 说明: nohup 命令对 server.js 进程做了三件事 (1)阻止SIGHUP信号发到这个进程. (2)关闭标准输入.该进程不再 ...

  10. recyclerView 嵌套 recyclerView 点击被拦截

    上层recyclerView.setLayoutFrozen(true);下层可以接收到点击事件.