深度优先搜索-linux上浅显易懂的例子
上次看啊哈算法中的深度优先搜索,自己用的是linux(linux粉,windows黑,嘿嘿),字符界面,为了强化对这个的理解,就在linux上对这个例子的代码做了一点修改可以很清楚的看到整个搜索过程,相当于动态的展示吧,虽然不是动画,本来想用QT来写的,不过实在是没时间(其实是QT太久没用了.....)
深度优先搜索说到底就是一条道走到黑直到达到目的,然后再往回走,看看上次选择的地方是否还有别的路可以选择走。代码中定义了宏MAX_NUM=8,
就是8x8的迷宫,
用户输入开始点和结束点,找到开始点到结束点的最短路径。LOOK:
其中工代表可以走的路,山是随机出现的20个障碍。
当指定了起始点后(没做校验,不能落在障碍点上),会将整个搜索过程在界面上打印出来,每秒显示一步:

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

这个只是其中一条最短路径,而为了减少运算量,我将当前的路径长度和已经找到的路径长度做对比,大于等于时就不往下找了。
因为当迷宫是40*40,没有加这个,我的虚拟机运行了1分钟都没有出来结果(当然是将打印去掉的情况下)。
源码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NUM 8 void dfs_print(); int maze[MAX_NUM][MAX_NUM];
int book[MAX_NUM][MAX_NUM];
int map[MAX_NUM][MAX_NUM];
int min=;
int px,py;
int startx, starty; int next[][] = {
{,},
{,},
{,-},
{-,}}; void dfs(int x, int y, int step)
{
int i;
int tx,ty; /*
printf("\n");
dfs_print();
sleep(1);
*/ if(step >= min)
return;
if(x==px && y==py)
{
printf("SUCCESS! 本次路径长度=%d", step);
if(step < min)
{
printf("本路径是当前最短的路径");
memcpy(map, book, sizeof(book));
min= step;
}
printf("\n");
return;
} for(i=;i<=;i++)
{
tx = x+next[i][];
ty = y+next[i][];
if(tx < || tx >=MAX_NUM || ty < || ty >= MAX_NUM)
continue; if(book[tx][ty] == && maze[tx][ty] == )
{
book[tx][ty] = ;
dfs(tx,ty,step+);
book[tx][ty] = ;
}
}
return;
} void dfs_print()
{
int i,j;
printf("\033[2J");
for(i=;i<MAX_NUM;i++)
{
for(j=; j<MAX_NUM; j++)
{
if(i==startx && j==starty)
printf("\033[40;31m头\033[0m");
else if(px==i && py==j)
printf("\033[40;31m尾\033[0m");
else if(maze[i][j]== && book[i][j]==)
printf("工");
else if(maze[i][j]== && book[i][j]==)
printf("\033[40;31m->\033[0m");
else if(maze[i][j] == )
printf("\033[40;32m山\033[0m");
}
printf("\n");
}
} void main()
{
int i,j;
int x;
int y; memset(maze, , sizeof(maze));
for(i=;i<MAX_NUM*;i++)
{
x = random()%MAX_NUM;
y = random()%MAX_NUM;
maze[x][y] = ;
} for(i=; i<MAX_NUM; i++)
{
for(j=; j<MAX_NUM; j++)
{
if(maze[i][j] == )
printf("工");
else
printf("山");
}
printf("\n");
} printf("please input start-end point:");
scanf("%d %d %d %d", &startx, &starty, &px, &py);
dfs_print();
book[startx][starty] = ;
dfs(startx, starty, );
printf("MIN=%d\n", min);
for(i=;i<MAX_NUM;i++)
{
for(j=; j<MAX_NUM; j++)
{
if(i==startx && j==starty)
printf("\033[40;31m头\033[0m");
else if(px==i && py==j)
printf("\033[40;31m尾\033[0m");
else if(maze[i][j]== && map[i][j]==)
printf("工");
else if(maze[i][j]== && map[i][j]==)
printf("\033[40;31m->\033[0m");
else if(maze[i][j] == )
printf("\033[40;32m山\033[0m");
}
printf("\n");
}
}
74C_~Y2HNGP.png)
深度优先搜索-linux上浅显易懂的例子的更多相关文章
- [算法入门]——深度优先搜索(DFS)
深度优先搜索(DFS) 深度优先搜索叫DFS(Depth First Search).OK,那么什么是深度优先搜索呢?_? 样例: 举个例子,你在一个方格网络中,可以简单理解为我们的地图,要从A点到B ...
- Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)
Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths) 这篇是DFS专题的第一篇,所以我会 ...
- 转:如何在Linux上提高文本的搜索效率
原文来自于:http://www.geekfan.net/6881/ 对于系统管理员或程序员来说,当需要在复杂配置的目录中或者在大型源码树中搜寻特定的文本或模式时,grep类型的工具大概是最受欢迎的. ...
- .netcore 在linux 上运行 Helllo World 例子
要想在linux上运行netcore ,需要在linux 安装netcore SKD 下面分两步完成, 首先我的操作系统是 Ubuntu 14.04 ,不同版本可以参考 官网给出的连接 https:/ ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- Wine——在Linux上运行Windows软件
官网:https://www.winehq.org/ 参考: wikipedia 教你使用Wine在Linux上运行Windows软件 如何安装和使用Wine,以便在Linux上运行Windows应用 ...
- 图的遍历之深度优先搜索(DFS)
深度优先搜索(depth-first search)是对先序遍历(preorder traversal)的推广.”深度优先搜索“,顾名思义就是尽可能深的搜索一个图.想象你是身处一个迷宫的入口,迷宫中的 ...
- "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)
本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...
- 第5章 Linux上管理文件系统
5.1 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- 精准化测试专业平台Paw:苹果APP应用代码质量的守护者
众所周知,一款苹果APP进入苹果应用商店后,要上排行榜,要被首页推荐,版本更新必不可少,但作为版本更新的关键所在,软件测试一直被业内吐槽“坑太多”,缺陷防不胜防.相关经验缺乏等等.若问如何“填坑”?以 ...
- 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析
本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...
- JavaScript回调函数的理解
这里是个人对回调函数的一段理解 <!DOCTYPE html> <html> <head> <title>回调函数</title> < ...
- IDisposable接口详解
转载:http://www.cnblogs.com/davyli/archive/2010/09/13/1825042.html 正确实现 IDisposable .NET中用于释放对象资源的接口是I ...
- XML样本(格式没区别,但是一个有结果 一个没结果)
xml样本01<orderlist> <order> <orderid>1</orderid> <ord ...
- 用css样式,为表格加入边框
Table 表格在没有添加 css 样式之前,是没有边框的.这样不便于我们后期合并单元格知识点的讲解,所以在这一节中我们为表格添加一些样式,为它添加边框. 在右侧代码编辑器中添加如下代码: <s ...
- 简单总结焦点事件、Event事件对象、冒泡事件
每学习一些新的东西,要学会复习,总结和记录. 今天来简单总结一下学到的几个事件:焦点事件.Event事件对象.冒泡事件 其实这几个事件应该往深的说是挺难的,但今天主要是以一个小菜的角度去尝试理解一些基 ...
- HDU 4632 CF 245H 区间DP(回文)
先说HDU 4632这道题,因为比较简单,题意就是给你一个字符串,然后给你一个区间,叫你输出区间内所有的回文子序列,注意是回文子序列,不是回文字串. 用dp[i][j]表示区间[i,j]内的回文子序列 ...
- jQuery firefox chrome IE 绑定mousewheel事件
$doc.on('mousewheel DOMMouseScroll',function(){ $htmlBody.stop(true); $goTop.stop(true); });
- 《asp.net mvc3 高级编程》第三章 视图
一.视图的作用 视图的职责是向用户提供界面.从ASP.NET MVC3开始,视图数据也可以通过ViewBag属性访问.例如:ViewBag.Message 就等于ViewData["Mess ...