每天学一丢之 IDDFS (5.28)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ShadowGhostH/article/details/80486894

每天学一丢意为每天学一点丢一点。

然后每天二字名存实亡,还是坚持在每天学习,只是每天学习的东西不够单开一文去总结。

这段时间在准备各种比赛,所以题解没有跟上,还不好说会不会补训练赛的题解。


IDDFS(iterative deepening deep-first-search)迭代 加深 搜索

首先第一点我们知道,在迷宫问题计算最短路的时候,我们经常使用BFS 这样做的好处是:第一次搜索到目标点时,就是到达目标点的最小步数。因为我们每次都存下了当前步能达到的所有点。而BFS所使用的空间开支较大,我们每一步都存下了当前步所能达到的所有点的坐标。而DFS的话,我们的空间开支较小,走了多少步就需要多少空间,但是因为没有一个明确的结束标准,所以我们不知道DFS要到什么时候停下来,所以也有可能会产生较大的时间开支。

这个时候,我们就学习到了一种新的搜索方法:迭代加深搜索。IDDFS的特点是:用BFS的思想去跑DFS。

我们知道DFS的搜索我们都有一个深度,那么我们限制每次搜索的深度,就像是用DFS每次去跑出BFS的某一层。

这个时候的好处是:我们的空间开销减少了,但是由于我们没加深一层,都相当于对其N-1层又跑了一遍DFS,而这个虽然是重复计算越多的内容越少(深度较小时节点数目较少)但累加起来也是不小的开销。所以相当于我们用时间去换取了部分空间。

所以IDDFS一般用于:空间限制较强,或BFS需要较大空间,而时间相对宽松的情况,给出一道例题和AC代码

POJ3134

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
using namespace std;
#define pb push_back
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", n);
#define pdd(n,m) printf("%d %d\n", n, m);
#define pld(n) printf("%lld\n", n);
#define pldd(n,m) printf("%lld %lld\n", n, m);
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define ansn() printf("%d\n",ans)
#define lansn() printf("%lld\n",ans)
#define r0(i,n) for(int i=0;i<(n);++i)
#define r1(i,e) for(int i=1;i<=e;++i)
#define rn(i,e) for(int i=e;i>=1;--i)
typedef long long LL;
typedef unsigned long long ull;
typedef long double ld;
const LL mod = 1000000007;
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const int maxn = 1e3+5;

int n, maxh;
int a[maxn];

bool dfs(int deep, int now)
{
    a[deep] = now;
    if(deep > maxh) return false;
    if(now == n) {
//        cout<<deep<<endl;
//        r0(i, deep+1)
//            printf("%d%c", a[i], i==n?'\n':' ');
        return true;
    }
    else if(now<<(maxh-deep) < n) return false+;

    for(int i=0; i<=deep; i++)
    {
        if(dfs(deep+1, now+a[i])) return true;
        else if(dfs(deep+1, abs(now-a[i]))) return true;
    }
    return false;
}

int main()
{
    while(sd(n) && n!=0)
    {
        r0(i, n+1){
            maxh = i;
            if(dfs(0, 1)) break;
        }
        pd(maxh);
    }
}

猜你喜欢

转载自blog.csdn.net/ShadowGhostH/article/details/80486894