ch2(搜索与图论)——迭代加深搜索

1.自然语言描述
迭代加深搜索是在原本的深度优先搜索基础上,控制了遍历状态空间树的深度;比如:第一次DFS,控制深度为depth,看在这种情况下是否能搜索到答案状态,如果没搜到,第二次DFS控制深度为depth+1,在看是否能搜到答案状态……以此类推,通过不断加大深度来搜索答案状态;迭代加深搜索适合于答案位于状态空间树的较浅层次但是整个状态空间树的深度非常大(直接搜索整个状态空间树会非常耗时/爆栈

同时,对于优先遍历的分支的选择,也有较优的方法:即优先遍历深度较小的树枝;这样有更大的概率能先搜到答案状态。

2.代码描述
题目:Acwing.170 加成序列 题目链接

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN=110;

int x[MAXN];
int n,cnt;

bool dfs(int u,int depth)
{
    if(u>depth) return false;//超过深度限制,则说明这一条路上没有答案结点
    if(x[u-1]==n) return true;//找到答案结点
    
    bool st[MAXN];
    memset(st,false,sizeof(st));//避免x[i]+x[j]的值重复计入
    
    for(int i=u-1;i>=0;i--){//优先深度较小的树枝:从较大数开始选
        for(int j=i;j>=0;j--){
            int s=x[i]+x[j];
            if(st[s]||s<=x[u-1]||s>n) continue;
            
            st[s]=true;
            x[u]=s;
            if(dfs(u+1,depth))
                return true;
        }
    }
    return false;
}

int main(void)
{
    x[0]=1;//序列第一个元素恒为1
    while(cin>>n&&n){
        
        int depth=1;//每次DFS都加大深度,直到搜索到答案结点
        while(!dfs(1,depth)) depth++;
        
        for(int i=0;i<depth;i++)
            cout<<x[i]<<' ';
        cout<<endl;
        
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值