POJ1426Find The Multiple

http://poj.org/problem?id=1426

题意 : 输入一个数n,找n的倍数m,这个m所满足的条件是,每一位数只能由0或1组成,在题目的旁边用红色的注明了Special Judge,表示一开始不懂什么意思,后来问的kkk,原来就是,样例的答案真的是样例,只要你输出符合要求的就行,不一定非要输出样例中给的。

思路 : 这个题分类其实是BFS,但在网上看了某大神博客之后瞬间用了DFS做出来了。。。

#include<iostream>

#include<cstdio>

using namespace std ;

int mark ;

void DFS(long long BB,int n ,int floor)

{

    if(mark)

    return ;

    if(BB % n == 0)

    {

        //cout<<BB<<endl;

        printf("%lld\n",BB) ;

        mark = 1 ;

        return ;

    }

    if(floor == 19)

    return ;

    DFS(BB*10,n,floor+1) ;

    DFS(BB*10+1,n,floor+1) ;

}

int main()

{

    int n ;

    while(cin>>n)

    {

        if(n == 0) break ;

        mark = 0 ;

        DFS(1,n,1) ;

    }

    return 0 ;

}
View Code

至于到19为什么就回溯了,这个的缘由我也不是很清楚,问了THH,他说是因为无论输入的n是什么,要找一个符合条件的m,都会保持在19位以内,在19位以内肯定会找出一个来

下面这个是kkk提供的方法,用的BFS,很简单的,队列存储,BFS的话,就是遍历10,11,若不符合条件,就在10后边加1位,可为1可为0,就是100或者101,在11后边再加一位,110,或者111,一直这样找下去,知道符合条件为止

#include<queue>

#include<cstdio>

using namespace std;

int n ;

void bfs()

{

    long long m,p = 1 ;

    queue<long long>Q;

    Q.push(p);

    while(!Q.empty())

    {

        p=Q.front();

        Q.pop();

        for(int i = 0 ;i < 2 ;i++)

        {

            m=10*p+i;

            if(m%n==0)

            {

                printf("%lld\n",m);

                return ;

            }

            Q.push(m);

        }

    }

}

int main()

{

    while(~scanf("%d",&n)&&n)

    {

        if(n == 1)

        {

            printf("1\n");

            continue;

        }

        bfs();

    }

    return 0;

}
View Code

 

你可能感兴趣的:(find)