总结一下实现dfs搜索时出现的小问题
发布日期:2021-06-29 11:10:22 浏览次数:2 分类:技术文章

本文共 1129 字,大约阅读时间需要 3 分钟。

1;每次路径搜索要注意是否要进行变化和[还原(回溯)]=有必要的时候才会有回溯;

例如hdu1010题;判断t时刻是否可以从S到达D处;这里就要每次这个路径结束时要还原;也就是回溯;看代码实现;

for(i=0;i<4;i++)    {        int fx=x+dir[i][0];        int fy=y+dir[i][1];        if(fx>=0&&fx
=0&&fy

看那两个map赋值就是完成这一步骤;实现变化和还原;

这一步骤就是实现了已fx,fy为中心往四周进行搜索的目的;

2;控制搜索的方向;就是用数组加上for循环来实现的;

看代码;
这是8方的搜索;要定义【8】【2】的数组;for(i = 0; i < 8; i++)来实现的;
4面也是同样的;

int fs[8][2]={
{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};void dfs(int x,int y){ int i,fx,fy; for(i = 0; i < 8; i++){
fx = x + fs[i][0]; fy = y + fs[i][1]; if(fx>=0&&fx
=0&&fy

3;进入递归的那个if判断,一定要注意其边界条件;要控制在矩阵内部;

代码;

if(fx>=0&&fx
=0&&fy

4;读入字符的时候尽量使用%s进行读入;还要注意与之前的横列别搞错了。

for(i = 0; i < a; i++){                scanf("%s",map1[i]);        }

5;这也是最重要最灵活的一点;

根据题目要求;
在合适的地方插入判断或者变量进行计数判断;实现相应的目的。
hdu1241就是在主函数那插入num++;进行计数

for(i = 0; i < a; i++){            for(j = 0; j < b; j++){                if(map1[i][j]=='@'){                    map1[i][j]='*';                    num++;                    dfs(i, j);                 }            }        }

hdu1010的迷宫类型的题;

问t时刻是否可以到达D处;
就是利用插入if的判断实现目的的;这些判断也叫做剪枝了;

转载地址:https://blog.csdn.net/zw1996/article/details/51906946 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:dfs剪枝1
下一篇:搜索dfs连通块问题1

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月20日 14时54分28秒