深度优先搜索-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");
}
}
深度优先搜索-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 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- TCP/IP协议原理与应用笔记10:TCP/IP协议族
1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...
- JPA事务回滚配置
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.or ...
- retrofit2 okhttp3 RxJava butterknife 示例
eclipse的jar包配置 eclipse中貌似用不了butterknife buildToolsVersion "23.0.2" defaultConfig { applica ...
- Android关闭系统锁屏
昨晚探索了一下Android系统内的目录,意外发现系统锁屏的数据库 使用adb shell进入系统根目录 adb shell su sqlite3 data/system/locksettings.d ...
- Web开发 < base target>
target就是点击链接后跳转到的目标页.通俗点说,就是你当前页面上的链接<a>,也包括<img>.<link>.<form>,除非你指定了target ...
- drop table xx purge
drop table xx purge; 说明: 所有删除的表都会在回收站里面,只有后面加上purge才是彻底的清空表. (一般用于测试.练习数据表,所以最好不要带purge,要不误删就找不到了.)
- JavaScript--Date函数
1. Date函数 var now = new Date(); 获取当前日期对象 now对象->Date.prototype->Object.prototype 将一个字符串转换为Date ...
- 重新开始学习javase_IO
一,认识IO 通过数据流.序列化和文件系统提供系统输入和输出. 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要 ...
- css expression explaination
http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx 据说已经被弃用的IE css写法,为了修复一些IE8及老版本 ...
- mktime性能问题
#include <time.h> int main() { for (int i = 0; i < 100000; ++i) { struct tm tm = {}; tm.tm_ ...