深度优先搜索-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 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- php-fpm 启动参数及重要配置详解<转>
原文地址 http://levi.cg.am/archives/3127 约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm. ...
- 【教训】rm -fr ./* 教训
昨晚犯了一个重大错误,运行了 rm -rf ./* 本来是要删除一个不重要的目录的,结果在它的父目录下运行了上面命令,结果...都没了... 幸好数据库文件没有被删掉,数据还在,网站程序被删掉了,不久 ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- Windows Azure上的Odoo(OpenERP)-2.在Ubuntu虚拟机上部署Odoo(OpenERP)
创建虚拟机的步骤在这里就不再赘述了,请参考上一篇博文. 首先用下述命令将Ubuntu系统进行更新: 1. sudo apt-get update 2. sudo apt-get upgrade 3. ...
- CSS3新增UI样式
圆角,border-radius: 1-4个数字/1-4个数字,前面是水平,后面是垂直,不给“/”表示水平和垂直一样,举例如下: <head> <meta http-equiv=&q ...
- Android中的BroadCast静态注册与动态注册
1.静态注册 新建MyBroadcast类继承BroadcastReceiver,实现onReceive方法 /** * Author:JsonLu * DateTime:2015/9/21 16:4 ...
- Web.Config文件中添加数据库配置文件
1获取所有配置文件节点的类ConfigurationManager 2数据库节点<ConnectionStrings> <add> name ="Sqlconnect ...
- c#将Excel数据导入到数据库的实现代码(OleDb)
sing System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web ...
- (转)Android调用系统自带的文件管理器进行文件选择并获得路径
Android区别于iOS的沙盒模式,可以通过文件浏览器浏览本地的存储器.Android API也提供了相应的接口. 基本思路,先通过Android API调用系统自带的文件浏览器选取文件获得URI, ...
- 状态开关按钮(ToggleButton)及按钮(Swich)的使用
状态开关按钮(ToggleButton)和开关(Switch)也是由Button派生出来的,因此它们本质上都是按钮,Button支持的各种属性.方法也适用于ToggleButton和Switch.从功 ...