Find The Multiple(DFS/BFS)

Find The Multiple

给定一个正整数n,请编写一个程序来寻找n的一个非零的倍数m,这个m应当在十进制表示时每一位上只包含0或者1。你可以假定n不大于200且m不多于100位。
提示:本题采用Special Judge,你无需输出所有符合条件的m,你只需要输出任一符合条件的m即可。

Input

输入包含多组数据,每组数据仅一行,只包含一个正整数n (1 <= n <= 200).

Output

对于输入的每组n,都输出任一符合条件的m。即使有多个符合条件的m,你也只需要输出一个即可。

Sample Input

2
6
19
0

Sample Output

10
100100100100100100
111111111111111111

这道题的话其实挺基础的吧,但是做了很久,好久没做了吧可能,也是基础本来就薄弱…

这道题呢, BFS , DFS 都能实现,下面也贴了两种方法。
先说 DFS :
从1开始搜,接下来是10,再接下来是100,再1000,假设都没有的话,就一直到 1e19 ,这时就会返回到上一级, 1e18 的那一级,开始执行下一步,也就是搜 1e18 +1,若不行,就是( 1e18 +1) * 10,这时又十九位了,若不符合于是又返回,就这样一直下去。
再说 BFS 嘛:
将1放入队列,判断队首不符合条件,符合就输出返回。将队首 *10和 *10+1放入队列,一直搜,直到满足条件,或者队列为空。这里没有考虑位数的问题,因为 bfs 是从小往大了搜,所以不存在找不到的情况,个人认为非空队列的条件也是可有可无的,因为总是会找到符合条件的就返回了。从开始,队列中有:
1
10
11
100
101
110
111
1010
1011
1100
1101
1110
1111
……
就一直这样放

#include <iostream>
#include <stdio.h>
#include<queue>

using namespace std;
long long m;
int flag;//flag的作用就是看是否找到了符合条件的数,如果是赋值1,返回。
void DFS(long long x,long long y)//x是位数,y是数值
{
    if(x>19||flag==1)
    {
        return ;
    }
    else
    {
        if(y%m==0)
        {
            flag=1;
            printf("%lld\n",y);
            return ;
        }
    }
    DFS(x+1,y*10);
    DFS(x+1,y*10+1);
}
void BFS(long long x,long long y)
{
    queue<long long>Q;
    Q.push(x);
    while(!Q.empty())
    {
        if(Q.front()%m==0)
        {
            printf("%lld\n",Q.front());
            return ;
        }
        Q.push(Q.front()*10);
        Q.push(Q.front()*10+1);
        Q.pop();
    }
}
int main()
{
    while(~scanf("%lld",&m)&&m)
    {
        //flag=0;//这里让我wa了一发,flag不初始化的话,除了第一个之后都是错的,应该很好理解哈。
        //DFS(1,1);
        BFS(1,1);
    }

    return 0;
}

还有就是,想说一下dfs和bfs的在这道题中的结果区别,其实还是很大的,dfs是一直会搜到底1e19,然后再返回上一级,然后再搜;而bfs就是直接从小往大了搜,所以一般来说dfs的结果是要比bfs大的。
嗯,差不多就这样。

猜你喜欢

转载自blog.csdn.net/weixin_44049850/article/details/86497865
今日推荐