POJ-1426-Find the multiply

这题深搜广搜都可以做,深搜的做法就是把每个由1 和 0 组成的数字拓展10倍以及拓展10倍+1,然后压入队列。

这样可以走过所有由10组成的数字,且两个方向平行发展(*10  +0和+1)。

bfs

#include <cstdio>
#include <queue>
using namespace std;
long long n, m;

void bfs()
{
    queue<long long> q;
    q.push(1);
    while (!q.empty()) {
        long long k = q.front();
        if (k%n==0) {
            m = k;
            break;
        }
        q.pop();
        q.push(k * 10);
        q.push(k * 10 + 1);
    }
}

int main()
{
    while (scanf("%lld",&n)&&n) {
        bfs();
        printf("%lld\n", m);
    }
    return 0;
}

dfs的话,我们就要考虑这个数是不是会超范围,long long是64位的,然后有符号类型的最大十进制数是19位的,所以当我们搜到

18位的时候,我们就可以退出了,因为这个方向搜不到,另外的一个+1方向肯定搜得到。

当我们搜到之后,要把flag标记为1,然后让所有的递归都退出,然后也是每次每个数都向两个方向搜索,不过就是单个数是先搜到

18位数字为顶,然后才返回,在没找到这个数的情况下。

dfs

#include <cstdio>
#include <queue>
using namespace std;
long long n, m, f;

void dfs(long long k,int bit)
{
    if (f==1)
        return;
    if (k%n==0) {
        m = k;
        f = 1;
        return;
    }
    if (bit==18)
        return;
    dfs(k * 10,bit+1);
    dfs(k * 10 + 1,bit+1);
}

int main()
{
    while (scanf("%lld",&n)&&n) {
        f = 0;
        dfs(1,0);
        printf("%lld\n", m);
    }
    return 0;
}

 

posted @ 2019-02-20 11:54  xyee  阅读(150)  评论(0编辑  收藏  举报