总结一下实现dfs搜索时出现的小问题

来源:互联网 发布:日本人基因 知乎 编辑:程序博客网 时间:2024/05/16 12:02

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<n&&fy>=0&&fy<m&&map[fx][fy]!='X')        {            map[fx][fy]='X';//变化;这个步骤就是实现搜索的中心             dfs(fx,fy,cnt+1);            map[fx][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<a&&fy>=0&&fy<b&&map1[fx][fy]=='@'){            map1[fx][fy]='*';            dfs(fx,fy);        }     } 

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

if(fx>=0&&fx<a&&fy>=0&&fy<b&&map1[fx][fy]=='@'){            map1[fx][fy]='*';            dfs(fx,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的判断实现目的的;这些判断也叫做剪枝了;

1 0