码迷,mamicode.com
首页 > 其他好文 > 详细

Tony的口胡呼呼(。-ω-)zzz

时间:2018-10-07 12:59:25      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:方案   扑克   开始   搜索   line   约数   ret   需要   深度优先   

深度优先搜索

从起始状态少的一侧开始搜索更优

例题

给你一副扑克中的 \(n\) 张牌, 出的下一张牌需要为前面出牌点数之和的约数, 求一种合法的方案

此题正向搜索代码如下:

void dfs(int depth, int sum){
    if(depth == n){
        output();
        return ;
        }
    REP(i, 1, n){
    if(!vis[i] && sum % a[i] == 0){
        vis[i] = 1;
        dfs(depth + 1, sum + a[i]);
        vis[i] = 0;
        }
    }
}

显然初始分支很多, 考虑逆向搜索

void dfs(int depth, int left){
    if(depth == 0){output();return ;}
    REP(i, 1, n){
    if(!vis[i] && (left - a[i]) % a[i] == 0){
        vis[i] = 1;
        dfs(depth - 1, left - a[i]);
        vis[i] = 0;
        }
    }
}
//调用
dfs(n, sum[a[i]]);

初始分支减少, 搜索量减少

Tony的口胡呼呼(。-ω-)zzz

标签:方案   扑克   开始   搜索   line   约数   ret   需要   深度优先   

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9749785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!