深度优先搜索-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 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...
随机推荐
- Java基础知识强化之IO流笔记20:FileOutputStream写出数据实现换行和追加写入
1. 如何实现数据的换行? (1) package com.himi.fileoutputstream; import java.io.FileNotFoundException; import j ...
- jQuery的选择器中的通配符[id^='code']或[name^='code']
这两天在做一个专题的时候遇到了一个通配符的问题 //弹层操作$(function(){ //视频播放 $("a[href^='#video']").each(function(in ...
- HTML 详细介绍
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- 5事件DOM零级事件跟DOM二级事件
事件的行为传播,行为本身跟事件绑定没有关系:1.全新认识事件(某一个具体的行为)->行为本身:浏览器天生自带的一些行为操作->click,mouseover(mouseenter),mou ...
- javascript判断值是否undefined
function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }
- Hibernate 一对多双向关联Demo
以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { privat ...
- 【USACO 3.1.3】丑数
[描述] 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是 ...
- jQuery 如何创建基本插件(翻译)
有时候,你希望有一块功能在整个代码当中都可以使用.例如,你可能想要有一个单一的方法可以在jQuery选择器上进行调用,用于处理该选择器上的一系列操作.又或许你编写了一个十分有用的工具函数,并希望能够简 ...
- Phalcon 的分流bootstrap 设计 主程序入口
<?php use \Phalcon\DI\FactoryDefault as PhDi; error_reporting(E_ALL); date_default_timezone_set(' ...
- delphi 创建数据库配置文件(TIniFile)
一.有必要了解INI文件的结构: ;注释 [小节名] 关键字=值 ... ---- INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值. ---- 值的类型有三种:字符串 ...