深度优先搜索-linux上浅显易懂的例子

  上次看啊哈算法中的深度优先搜索,自己用的是linux(linux粉,windows黑,嘿嘿),字符界面,为了强化对这个的理解,就在linux上对这个例子的代码做了一点修改可以很清楚的看到整个搜索过程,相当于动态的展示吧,虽然不是动画,本来想用QT来写的,不过实在是没时间(其实是QT太久没用了.....)

  深度优先搜索说到底就是一条道走到黑直到达到目的,然后再往回走,看看上次选择的地方是否还有别的路可以选择走。代码中定义了宏MAX_NUM=8,

就是8x8的迷宫,

用户输入开始点和结束点,找到开始点到结束点的最短路径。LOOK:

其中工代表可以走的路,山是随机出现的20个障碍。

当指定了起始点后(没做校验,不能落在障碍点上),会将整个搜索过程在界面上打印出来,每秒显示一步:

当然也可能觉得不停的打印会太繁琐,那就将dfs中的调用dfs_print和sleep注释掉即可。

再看看最终的结果:

这个只是其中一条最短路径,而为了减少运算量,我将当前的路径长度和已经找到的路径长度做对比,大于等于时就不往下找了。

因为当迷宫是40*40,没有加这个,我的虚拟机运行了1分钟都没有出来结果(当然是将打印去掉的情况下)。

源码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #define MAX_NUM 8
  5
  6 void dfs_print();
  7
  8 int maze[MAX_NUM][MAX_NUM];
  9 int book[MAX_NUM][MAX_NUM];
 10 int map[MAX_NUM][MAX_NUM];
 11 int min=10000;
 12 int px,py;
 13 int startx, starty;
 14
 15 int next[4][2] = {
 16         {0,1},
 17         {1,0},
 18         {0,-1},
 19         {-1,0}};
 20
 21 void dfs(int x, int y, int step)
 22 {
 23         int i;
 24         int tx,ty;
 25
 26         /*
 27         printf("\n");
 28         dfs_print();
 29         sleep(1);
 30         */
 31
 32         if(step >= min)
 33                 return;
 34         if(x==px && y==py)
 35         {
 36                 printf("SUCCESS! 本次路径长度=%d", step);
 37                 if(step < min)
 38                 {
 39                         printf("本路径是当前最短的路径");
 40                         memcpy(map, book, sizeof(book));
 41                         min= step;
 42                 }
 43                 printf("\n");
 44                 return;
 45         }
 46
 47
 48         for(i=0;i<=3;i++)
 49         {
 50                 tx = x+next[i][0];
 51                 ty = y+next[i][1];
 52                 if(tx <0 || tx >=MAX_NUM || ty <0 || ty >= MAX_NUM)
 53                         continue;
 54
 55                 if(book[tx][ty] == 0 && maze[tx][ty] == 0)
 56                 {
 57                         book[tx][ty] = 1;
 58                         dfs(tx,ty,step+1);
 59                         book[tx][ty] = 0;
 60                 }
 61         }
 62         return;
 63 }
 64
 65 void dfs_print()
 66 {
 67         int i,j;
 68         printf("\033[2J");
 69         for(i=0;i<MAX_NUM;i++)
 70         {
 71                 for(j=0; j<MAX_NUM; j++)
 72                 {
 73                         if(i==startx && j==starty)
 74                                 printf("\033[40;31m头\033[0m");
 75                         else if(px==i && py==j)
 76                                 printf("\033[40;31m尾\033[0m");
 77                         else if(maze[i][j]== 0 && book[i][j]==0)
 78                                 printf("工");
 79                         else if(maze[i][j]== 0 && book[i][j]==1)
 80                                 printf("\033[40;31m->\033[0m");
 81                         else if(maze[i][j] == 1)
 82                                 printf("\033[40;32m山\033[0m");
 83                 }
 84                 printf("\n");
 85         }
 86 }
 87
 88
 89 void main()
 90 {
 91         int i,j;
 92         int x;
 93         int y;
 94
 95         memset(maze, 0, sizeof(maze));
 96         for(i=0;i<MAX_NUM*2;i++)
 97         {
 98                 x = random()%MAX_NUM;
 99                 y = random()%MAX_NUM;
100                 maze[x][y] = 1;
101         }
102
103         for(i=0; i<MAX_NUM; i++)
104         {
105                 for(j=0; j<MAX_NUM; j++)
106                 {
107                         if(maze[i][j] == 0)
108                                 printf("工");
109                         else
110                                 printf("山");
111                 }
112                 printf("\n");
113         }
114
115         printf("please input start-end point:");
116         scanf("%d %d %d %d", &startx, &starty, &px, &py);
117         dfs_print();
118         book[startx][starty] = 1;
119         dfs(startx, starty, 0);
120         printf("MIN=%d\n", min);
121         for(i=0;i<MAX_NUM;i++)
122         {
123                 for(j=0; j<MAX_NUM; j++)
124                 {
125                         if(i==startx && j==starty)
126                                 printf("\033[40;31m头\033[0m");
127                         else if(px==i && py==j)
128                                 printf("\033[40;31m尾\033[0m");
129                         else if(maze[i][j]== 0 && map[i][j]==0)
130                                 printf("工");
131                         else if(maze[i][j]== 0 && map[i][j]==1)
132                                 printf("\033[40;31m->\033[0m");
133                         else if(maze[i][j] == 1)
134                                 printf("\033[40;32m山\033[0m");
135                 }
136                 printf("\n");
137         }
138 }

时间: 2024-10-13 08:54:41

深度优先搜索-linux上浅显易懂的例子的相关文章

图的深度优先搜索及拓扑排序

本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍). 1. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优先搜索要解决一个问题,那就是顶点的重复访问,假设图中存在一个环路A-B-C-A,那么对顶点A进行展开后得到B,对B进行展开后得到C,然后对C进行展开后得到A,然后A就被重复访问了... 这显然是不对的!我们需要用一个状态变量来记录一个顶点被访问和被展开的状态.在<算法导论>中,作者使用3种颜色来对

如何在Linux上提高文本的搜索效率

对于系统管理员或程序员来说,当需要在复杂配置的目录中或者在大型源码树中搜寻特定的文本或模式时,grep类型的工具大概是最受欢迎的. 如果grep是你最喜欢的工具之一,那么你可能会更喜欢ack.ack是一个基于Perl的类似于grep的命令行工具,但是搜索速度更快,能力比grep更强.尤其是当你是程序员时,我强烈推荐你使用ack来取代grep. ack的用法非常适用与代码搜索,因此程序员可以在源码树中进行复杂的查询,而只需要更少的按键. ack的特性 ack的一些非常强大的特性: 默认搜索当前工作

转:如何在Linux上提高文本的搜索效率

原文来自于:http://www.geekfan.net/6881/ 对于系统管理员或程序员来说,当需要在复杂配置的目录中或者在大型源码树中搜寻特定的文本或模式时,grep类型的工具大概是最受欢迎的. 如果grep是你最喜欢的工具之一,那么你可能会更喜欢ack.ack是一个基于Perl的类似于grep的命令行工具,但是搜索速度更快,能力比grep更强.尤其是当你是程序员时,我强烈推荐你使用ack来取代grep. ack的用法非常适用与代码搜索,因此程序员可以在源码树中进行复杂的查询,而只需要更少

一个例子,关于航班线路的深度优先搜索

1 java 代码,摘自<java 编程艺术> 2 3 /** 4 * 航班信息类 5 * 用于存放航班线路 6 * @author shiyan 7 * 8 */ 9 public class FlightInfo { 10 String from;//出发城市 11 String to;//目的城市 12 int distance;//距离 13 boolean skip;//回退标志 14 public FlightInfo(String f,String t,int d){ 15 th

迷宫问题 - 堆栈与深度优先搜索

堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素. 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走

图的遍历之深度优先搜索(DFS)

深度优先搜索(depth-first search)是对先序遍历(preorder traversal)的推广.”深度优先搜索“,顾名思义就是尽可能深的搜索一个图.想象你是身处一个迷宫的入口,迷宫中的路每一个拐点有一盏灯是亮着的,你的任务是将所有灯熄灭,按照DFS的做法如下: 1. 熄灭你当前所在的拐点的灯 2. 任选一条路向前(深处)走,每经过一个拐点将灯熄灭直到与之相邻的拐点的灯全部熄灭后,原路返回到某个拐点的相邻拐点灯是亮着的,走到灯亮的拐点,重复执行步骤1 3. 当所有灯熄灭时,结束 将

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜

从排列到组合——深度优先搜索

前段时间在洛谷3.0上刷到一个题,让本人挠头了一段时间,RT: 题目描述 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34. 现在,要求你计算出和为素数共有多少种. 例如上例,只有一种的和为素数:3+7+19=29. 首先解决这个问题显

So Easy! Oracle在Linux上的安装配置系列三使用create database创建数据库

本文为So Easy! Oracle在Linux上的安装配置系列的第三篇,使用create database创建数据库,本序列第一篇介绍了学习实验环境的搭建包括:在win 7中使用VMware Workstation 创建虚拟机,安装CentOS-6.6-x86_64,网络配置 和使用xshell连接远程linux服务器,上传Oracle软件和使用操作系统安装光盘搭建本地yum源,第二篇专门说了Oracle11g R2在CentOS6.6上的安装,包括Oracle安装前的准备工作,并以图文详细介