小谈深度优先搜索

最近读了一本算法书,书中提到了深度优先算法,于是我就整理了一下。


引入小题:


解决方案:这里先使用最简单最常用的穷举法时行求解。(此代码中的book数组起到了标记的作用,可以参考桶装法排序了解标记的好处和作用)

#include <stdio.h>int main(){//因为要填写9个数字,所以这里用数组a存放9次数字的变量,方便在book标记数组内操作 int a[10], book[10];int i, sum, total = 0;for(a[1] = 1; a[1] <= 9; a[1] ++)for(a[2] = 1; a[2] <= 9; a[2] ++)for(a[3] = 1; a[3] <= 9; a[3] ++)for(a[4] = 1; a[4] <= 9; a[4] ++)for(a[5] = 1; a[5] <= 9; a[5] ++)for(a[6] = 1; a[6] <= 9; a[6] ++)for(a[7] = 1; a[7] <= 9; a[7] ++)for(a[8] = 1; a[8] <= 9; a[8] ++)for(a[9] = 1; a[9] <= 9; a[9] ++){//初始book标记数组 for(i = 1; i <= 9; i++){book[i] = 0;}//将获得的序列标记一下,方便判断是否全为不一样的数字for(i = 1; i <= 9; i++) {book[a[i]] = 1;}//用于判断是否为9个不同的数字 sum = 0;for(i = 1; i <= 9; i++){if(book[i] == 1) sum ++;}if(sum == 9 && a[1] * 100 + a[2] * 10 + a[3] + a[4] * 100 + a[5] * 10 + a[6] == a[7] * 100 + a[8] * 10 + a[9] ){total ++;printf("%d%d%d + %d%d%d = %d%d%d\n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);}}printf("共有%d个这样的数\n", total / 2);									return 0;
}


初入DFS小题:

给出n,组成n位的全排序。(1 <= n)

解决方案:如果已知n的话,可以在程序里面写入n个for循环,来得出需要的结果,但是这个n是在程序运行时给出的,所以这里需要用递归实现。

#include <stdio.h>
#include <stdlib.h>int *box, *book, n;void dfs(int step){int i;if(step >= n + 1){for( i = 1; i <= n; i++ ){printf("%d", box[i]);	}printf("\n");return;}for(i = 1; i <= n; i++){if(book[i] == 0){box[step] = i;book[i] = 1;dfs(step + 1);book[i] = 0;}}
}int main(){	int i;scanf("%d", &n);//因为此处下标要从1开始,所以数组要加1 box = (int *)malloc(sizeof(int) * (n + 1));book = (int *)malloc(sizeof(int) * (n + 1));//初始book标记数组for(i = 1; i <= n; i++) book[i] = 0;dfs(1);return 0;
}

涉及算法:可以把DFS归结为如下模型

void dfs(int step) {判断边界  (越界返回) 尝试每一种可能 for(i = 0; i < n; i++) {处理继续下一步 dfs(step + 1) 处理 }
}

重试第一题: 可使用DFS算法来编写这个题,运行效率能提高10倍(当然,这个算法效率也不高)。

#include <stdio.h>
#include <stdlib.h>int *box, *book, n = 9, total = 0;void dfs(int step){int i;if(step >= n){if(box[0] * 100 + box[1] * 10 + box[2] +box[3] * 100 + box[4] * 10 + box[5] ==box[6] * 100 + box[7] * 10 + box[8]){total ++;printf("%d%d%d + %d%d%d = %d%d%d\n", box[0], box[1], box[2], box[3], box[4], box[5], box[6], box[7], box[8]);}return;}for(i = 1; i <= n; i++){if(book[i-1] == 0){box[step] = i;book[i-1] = 1;dfs(step + 1);book[i-1] = 0;}}
}int main(){	int i;scanf("%d", &n);//因为此处下标要从1开始,所以数组要加1 box = (int *)malloc(sizeof(int) * (n));book = (int *)malloc(sizeof(int) * (n));//初始book标记数组for(i = 0; i < n; i++) book[i] = 0;dfs(0);printf("共有%d个", total / 2); return 0;
}

再来一题:

有一天,小哈一个去玩迷宫。但是方向感很不好的小哈很快就迷路了。小哼得知后便立即去解救无助的小哈。小哼当然是有备而来,已经弄清楚了迷宫地图,现在小哼要以最快速度去解救小哈。问题就此开始了……
  迷宫由n行m列的单元格组成,每个单元格要么是空地,要么是障碍物。你的任务是帮助小哼找到一条从迷宫的起点到小哈所在位置的最短路径,注意障碍物是不能走的,当然也不能走到迷宫之外。n和m都小于等于100。


输入格式:第一行有两个数N M。N表示迷宫的行,M表示迷宫的列。接来下来N行M列为迷宫,0表示空地,1表示障碍物。最后一行4个数,前两个数为迷宫入口的x和y坐标。后两个为小哈的x和y坐标。

样例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int **map, **book, min = 999999;
int p, q, M, N; //终点 void dfs(int x, int y, int step){int i, cX, cY;//方向数组int next[4][2] = {{0, 1}, //右 {1, 0}, //下 {0, -1}, //左 {-1, 0}  //上};//边界条件 if( x == p && y == q) {if(step < min) min = step;return;}//遍历条件(四个方向)for(i = 0; i < 4; i++){cX = x + next[i][0];cY = y + next[i][1];//越界 不操作 if(cX < 0 || cY < 0 || cX > N - 1 || cY > M - 1) continue;if(book[cX][cY] == 0 && map[cX][cY] == 0){//标记此地点已走过 book[cX][cY] = 1;dfs(cX, cY, step + 1);book[cX][cY] = 0;				}		}return;
}int main(){	int startX, startY;int i, j;scanf("%d %d", &N, &M);	map = (int **)malloc(sizeof(int *) * N);book = (int **)malloc(sizeof(int *) * N);for(i = 0; i < N; i++){map[i] = (int *)malloc(sizeof(int) * M);book[i] = (int *)malloc(sizeof(int) * M);}for(i = 0; i < N; i++)for(j = 0; j < M; j++)book[i][j] = 0;for(i = 0; i < N; i++){for(j = 0; j < M; j++){scanf("%d", &map[i][j]);}}	scanf("%d %d %d %d", &startX, &startY, &p, &q);startX--;startY--;p--;q--;book[startX][startY] = 1;dfs(startX, startY, 0);if(min == 999999){printf("No Way!");}else{printf("%d", min);	}return 0;
}
可见此算法效率并不高。


BFS算法处理(明显提高时间复杂度,但空间复杂度提升):

#include <stdio.h>struct  Node{int x;int y;int s;
};int main(){int startX, startY, n, m, p, q, tX, tY, head = 1, tail = 1, flag = 0;int i, j;int a[101][101] = {0}, book[101][101] = {0},next[4][2]={{0, 1}, //右 {1, 0}, //下 {0, -1}, //左 {-1, 0}  //上 };struct Node que[100000];//接收初值 scanf("%d %d", &n, &m);for(i = 1; i <= n; i++){for(j = 1; j <= m; j++){scanf("%d", &a[i][j]);}}scanf("%d %d %d %d", &startX, &startY, &p, &q);que[tail].x = startX;que[tail].y = startY;que[tail].s = 0;book[startX][startY] = 1;tail ++;while(head < tail){for(i = 0; i < 4; i ++){tX = que[head].x + next[i][0];tY = que[head].y + next[i][1];if(tX < 1 || tX > n || tY < 1 || tY > m){continue;}if(a[tX][tY] == 0 && book[tX][tY] == 0){que[tail].x = tX;que[tail].y = tY;que[tail].s = que[head].s + 1;book[tX][tY] = 1;tail ++;if(tX == p && tY == q){flag = 1;}}}if(flag == 1) break;head ++;}if(flag == 1){printf("%d", que[tail - 1].s);}else{printf("No Way!");}return 0;
} 

博客名称:王乐平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim学习(2)小幅提升

2019独角兽企业重金招聘Python工程师标准>>> 搜索&#xff1a; 忽略大小写&#xff1a; :set ignorecase :set noignorecase 在文本中查找下一个WORD: 把光标定位于这个word上&#xff0c;然后按下"*"键 /word "#"命令是&qu…

NetCore NW714 v2.0路由器TTL救砖

路由器成砖状态&#xff1a; 1.客户端无法获取IP地址 2.客户端设置IP地址后&#xff0c;无法PING通路由器IP地址。 3.路由器按reset按钮&#xff0c;无法重置路由器。 4.路由器的指示灯只有SYS和WPS亮&#xff0c;WPS微亮。 5.在路由器的LAN口和WLAN口插入网线&#xff0c;相应…

斐讯k1路由器刷Breed BootLoader(不死UBoot)

前段时间斐讯搞活动&#xff0c;我入手了一部139元的斐讯K1路由器&#xff0c;感觉硬件配置不错&#xff0c;于是就给K1路由器刷入了Breed启动程序。 路由器外观&#xff1a; 路由器内观&#xff1a; 硬件配置&#xff1a; CPU&#xff1a;MediaTek MT7620A ver 2,eco 6 内存…

Openwrt虚拟WAN口叠加网速

Openwrt路由器系统功能强大&#xff0c;接下来我就要用这个系统叠加网速了。 网络环境 我这边用的网络是学校办公室的&#xff0c;听到学校办公室的网&#xff0c;大家应该会认为网速很快&#xff0c;但是我这个学校在交换机上把每个IP的最大速率限制在了1MB/S&#xff0c;实在…

PHPCMS代码生成器

软件截图 软件说明 软件名称&#xff1a;PHPCMS代码生成器 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;此软件是用于对PHPCMS模板进行编辑制作的高效代码生成器&#xff0c;大部分的操作代码在此软件内都可实现&#xff0c;欢迎使用。 火眼检测报告…

18款 非常实用 jquery幻灯片图片切换

1、jquery图片滚动仿QQ商城带左右按钮控制焦点图片切换滚动 jquery图片特效制作仿腾讯QQ商城首页banner焦点图片轮播切换效果&#xff0c;带索引按钮控制和左右按钮控制图片切换。 查看演示>> 下载地址 2、jquery图片切换插件制作图片层叠缩放展示效果 jquery图…

全国电视直播v1.0

软件截图 软件说明 软件名称&#xff1a;电视直播 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;此软件可以观看几乎全国各地的电视台&#xff0c;无如播放不流畅&#xff0c;可以切换左侧的播放源&#xff0c;欢迎使用。 下载地址&#xff1a;http…

迅雷会员帐号获取器

软件截图 软件说明 软件名称&#xff1a;迅雷会员获取器 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;此在左上角的下拉列表框中选择来源&#xff0c;单击“获取帐号”即可在下方的列表中出现迅雷会员的账号和密码&#xff0c;如果获取失败&#x…

HTML代码转换编辑器

软件截图 软件说明 软件名称&#xff1a;HTML代码转换编辑器 版本&#xff1a;v1.0 开发语言&#xff1a;C# .Net framework3.5 下载地址&#xff1a;http://download.csdn.net/detail/lecepin/9417174 博客名称&#xff1a;王乐平博客 博客地址&#xff1a;http://blog.le…

系统时间校准工具

软件截图 软件说明 软件名称&#xff1a;系统时间校准 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;方便电脑系统时间不正确&#xff0c;每次启动时间都重置等时间不正确的情况&#xff0c;提供时间校准的方便。校准时间均为世界标准时间同步网络…

系统关机助手

软件截图 软件说明 软件名称&#xff1a;系统关机助手 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;方便关机、重启、注销等操作的小软件&#xff0c;欢迎使用。 下载地址&#xff1a;http://download.csdn.net/detail/lecepin/9418082 博客名称&a…

poj1703

题目大意&#xff1a;一共有两个类&#xff0c;两种操作D X Y表示X Y在不同的类里面&#xff0c;A X Y 询问X Y之间的关系(未知&#xff0c;相同&#xff0c;不同) 分析&#xff1a;简单带权并查集&#xff0c;D[i]表示与i对立的类&#xff0c;维护好这个变量就可以了。 1 #inc…

SEO原创文章制作器

软件截图 软件说明 软件名称&#xff1a;SEO原创文章制作器 版本&#xff1a;v1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;SEO福利工具&#xff0c;可直接从网上将内容复制到本软件&#xff0c;然后生成文字不一样但意思一样的原创文本。 此软件可以设置原创级别。…

水星MW300R v2 路由器刷DD-Wrt 小记

家里有一个水星MW300R v2 的路由器&#xff0c;之前在这个路由器上刷过OpenWrt&#xff08;可参照我这个博文&#xff1a;http://wlpblog.blog.163.com/blog/static/217614257201511252554386/&#xff09;&#xff0c;后来刷回了原系统。最近发觉这个路由器系统有点问题&#…

ns,ui

转&#xff1a;http://blog.csdn.net/fengsh998/article/details/8842885 Cocoa框架是iOS应用程序的基础&#xff0c;了解Cocoa框架&#xff0c;对开发iOS应用有很大的帮助。 1、Cocoa是什么&#xff1f; Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为…

Android手机调整/data分区和/sdcard分区

现在手上有一块E160K的手机&#xff0c;手机内存是32GB的&#xff0c;由于之前对这个手机刷机不当&#xff0c;造成用户分区20GB多&#xff0c;而内置SD仅仅只有5GB多&#xff0c;造成了严重的资源浪费&#xff0c;所以我需要把这两个分区的大小调整一下。 问题分析&#xff1a…

Joseph Problem(解约瑟夫问题)

今天在一个OJ上做了一个Joseph Problem&#xff08;解约瑟夫问题&#xff09;的题&#xff0c;题目不难&#xff0c;直接用循环链表模拟实际操作即可完成&#xff0c;但是用此种方法的时间太长&#xff0c;超时&#xff0c;所以我就用了一个大家对这类问题比较常用的解法——数…

linux下mono的安装与卸载

我很遗憾的告诉你&#xff0c;这里没有安装&#xff0c;为什么标题里加入安装俩字呢&#xff0c;因为如果不加的话你会搜到这篇文章吗&#xff1f;哈哈&#xff01;别气馁&#xff0c;这里会给你些安装的tips&#xff01; 源码安装&#xff0c;git安装&#xff1a;建议安装路径…

繁体简体转换器 v 1.0

软件截图 软件说明 软件名称&#xff1a;繁体简体转换器 软件版本&#xff1a; 1.0 开发语言&#xff1a;易语言 软件说明&#xff1a;本软件主要是用于繁体中文转换为简体中文的工具&#xff0c;如果你想把转换后的文本用于MarkDown中&#xff0c;可以勾选“HTML转义”复选…

C#实现Combobox自动匹配字符

不多说了,如图,应客户要求,下拉框中需要自动匹配字符,可能有些人一早就对此很熟,但相对于我还是首次使用,还是花了一点时间,现记录下来,也希望能帮助大家更好的理解. 首先要设定Combobox的DropDownStyle属性为DropDown,而不是DropDownList.然后设定匹配数据源,有两种方法 第一种…