深度优先搜索-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 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- 今日推荐(三)AndroidResideMenu类似QQ侧滑效果
效果图: DEMO 本代码即是DEMO,您可以下载后选择您喜欢的IDE运行.SDK版本建议使用4.0以上 Version Migration 从 v1.0, v1.1, v1.2, v1.3 升级到 ...
- warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
先来一段json_decode官方说明 mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, i ...
- vsftp配置主动模式和被动模式
配置文件:/etc/vsftpd/vsftpd.conf 主动模式配置方法: 主动式连接使用的数据通道 connect_from_port_20=YES 支持数据流的被动式连接模式 pasv_enab ...
- Proxy 代理模式
简介 代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象. java.lang.reflect.Proxy RMI 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对 ...
- js 实现关键词球状旋转效果
效果图 html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- Alibaba FastJson
import com.alibaba.fastjson.JSON import com.alibaba.fastjson.JSONObject class Test { static main(arg ...
- c# 网站发布
.net 网站发布简单步骤: 1.选择需要发布的网站,右击->发布 1)配置文件:可以任意新建文件配置名 2)连接: 发布方法选择系统文件:选择目标位置,任意新建一个位置即可. 3)设置:选择D ...
- jquery中$.ajax的$.get与$.post使用
<script type='text/javascript' src='http://ajax.useso.com/ajax/libs/jquery/1.7.2/jquery.min.js?ve ...
- RSA加密算法正确性证明
RSA加密算法是利用大整数分解耗时非常大来保证加密算法不被破译. 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k为n的欧拉函数,k=ϕ(n)=(p−1)(q−1) 选择任意整数a,保证 ...
- Jssdk微信分享
<?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...