【深搜学习1】

博主分享了使用深度优先搜索(DFS)解决两个编程问题的经验,分别是寻找迷宫中最短路径和规划健康奶牛饲料搭配。在实现过程中,博主遇到了独立性问题和记录答案的细节错误,通过不断调试和反思,最终成功解决了问题。博主强调了理论学习和实践结合的重要性,以及在面对挑战时保持耐心和专注。
摘要由CSDN通过智能技术生成

 1、题目大意:找从起点到终点的最短路步数;【迷宫类】

深搜!(这还是第一次完全自己写出来的,阶段性的一点进步)

#include <bits/stdc++.h>
using namespace std;
int a[50][50],book[50][50],n,m,zx,zy,min1=999999;
int fx[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x,int y,int step)
{
    if(x==zx&&y==zy)
    {
        if(step<min1)
            min1=step;
            cout<<x<<" "<<y<<endl;
        return ;
    }
    int tx=x,ty=y;
    for(int i=0;i<=3;i++)
    {
        tx=x+fx[i][0],ty=y+fx[i][1];
        if(x<1||x>n||y<1||y>m)
            continue;
        if(book[tx][ty]==0&&a[tx][ty]==0)
         {
            book[tx][ty]=1;
            dfs(tx,ty,step+1);
            book[tx][ty]=0;
         }
    }
    return;
}
int main()
{
    //freopen("int.txt",stdin);
    int startx,starty;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
          cin>>a[i][j];//0表示空地,1表示障碍物;
    cin>>startx>>starty>>zx>>zy;
    book[startx][starty]=1;
    dfs(startx,starty,0);
    cout<<min1;
    getchar();getchar();
    return 0;
}

2、[USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins - 洛谷

老经典的题了,也是在从自己写这个题的过程中发现自己的很多问题

首先值得表扬的是,自己的思路和关键步骤都正确(此时耗时1h,不知道为啥,写在纸上以后老是容易断片,忘了这一步要干啥,可能太在意是不是漏了啥细节了),于是迎来了电闪雷鸣,打草稿的时候就模糊细节处怎么实现,果然,又栽了。

深搜的核心,要知道这一步搜索需要做什么(把这一步的所有可能结果考虑完全),和下一步分离!因为步骤是重复的!要保持这一步的独立性!所以第一遍找到了最核心的bug。(然而这还是妥协后发现的,因为照着之前的代码我就寻思一定能通过微调改对程序,但是看到题解后发现之前的行不通,所以dfs()内全重新写)

还没完,那怎么记录答案所选取的饲料种类数和序号?(此前还没想到dfs()括号内要带变量)所以dfs()的括号内放的是,和求解的答案有关,且在所有的搜索过程中都有身影的变量(找找能把这一步和下一步联系起来的变量),在这里找的是正查找到的位置和已选饲料种类数.

这下应该过了吧,结果判断所选饲料是否够数的函数里又带错数组了,不应该计算最终答案的饲料序号,而是临时选择的饲料序号;

综上,这个题才过。历时4小时左右;

其实上学期很多题都没能自己动手写一写,其中很多会漏掉的细节还是需要自己思考才能发现。

其实几天之前我还是按照题单顺序一个个做的,又个别不会的(比方说搜索,dp)就先跳过去了,因为读完题目后发现搜索的具体实现我还是不能靠自己完全写出来,而且dp的状态方程看题解上面的还看不懂,所以想着既然不会的都挺集中的,不如系统的重新学,先搭起来理论地基,再实践,再深入难一点的理论理解,再实践。这样虽然比较慢而且可能会在综合时不能辨题类型,但是我的理论基础还是有很大程度上的欠缺的,望系统学习后可以见题有思路,知道可以用啥解决,可以自己琢磨哪里能改进而不是运行都有问题。

玩的多了也会腻,还没啥收获,还是喜欢充实的生活,起码一天下来知道自己做什么了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迎风809

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值