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

 

posted on 2013-08-26 21:40  枫、  阅读(286)  评论(0编辑  收藏  举报