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

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的判断实现目的的;这些判断也叫做剪枝了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值