总结桀桀桀

B3625迷宫寻路

1.本题不是求路径,而是判断是否有路,所以不能用回溯法(会超时de),用洪水填充法即可

void dfs(int x,int y){
    if(x==n&&y==m){
        flag=true;
        cout<<"Yes"<<endl;
        exit(0);
    }
    vis[x][y]=1;
    for(int i=0;i<4;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<1||ny<1||nx>n||ny>m) continue;
        if(vis[nx][ny]) continue;
        if(z[nx][ny]=='#') continue;
        dfs(nx,ny);
    }
}

exit(0)是退出程序,用return 不能AC

PS:二者的区别:

exit(0):正常运行程序并退出程序;
return():返回函数。如果它在main函数中,它将退出函数并返回一个值。

vis:标记路径

dfs后面没有清空标记

2.判断起始点是否是空地

if(z[1][1]=='#') cout<<"No"<<endl;

3.dfs是void类型,不是int(::>_<:: )

P1460健康的荷斯坦奶牛

1.先定义一个check数组,判断喂的维他命是否够了

bool check(int cnt){
    for(int i=1;i<=v;i++){
        int sum=0;
        for(int j=1;j<=cnt;j++){
            sum+=si[save[j]][i];
        }
        if(sum<need[i]) return false;
    }
    return true;
}

注意定义sum的位置

2.深度优先搜索:当确定第k步时,说明k-1步已经确定了

void dfs(int k){
    if(mi<=(k-1)||(k-1)>g) return;
    if(check(k-1)){
        mi=min(mi,k-1);
        for(int i=1;i<=mi;i++){
            ans[i]=save[i];//将save数组中的值赋到ans数组中
        }
        return;
    }
    int s=save[k-1];//为了避免重复,所以下一次应从上一次的下一位开始
    for(int i=s+1;i<=g;i++){
        save[k]=i;
        dfs(k+1);
    }
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值