poj1426(bfs dfs)

输入一个整数,求大于等于这个整数的且满足条件的最小值 ,条件是这个整数能整出输入的整数,且这个整数只能包括0和1

解题思路:看了有些大神做法,取模神马的好复杂,其实可以直接从前往后两个方向的深搜就可以搜到。
后记:做后面题,发现一旦情况比较多,就会TLE,自己判断时间复杂度的能力也弱,所以以后这种题就广搜:求满足某种条件下的最优情况。

#include<cstdio>
#include<algorithm>
long long n,DEP;
long long s;
bool flag;
void dfs(long long i,int step)
{
    if(flag) return;
    if(step>=DEP) return;//让第一个方向搜不到就像第二个方向收
    if(i%n==0)
    {
        printf("%lld\n",i);
        flag=true;
        return;
    }
    dfs(i*10,step+1);
    dfs(i*10+1,step+1);
}

int main()
{
    while(~scanf("%d",&n)&&n)
    {
        flag=false;
        for(DEP=1;;++DEP)//让第一个搜不到就结束
        {
            if(flag)
                break;

            dfs(1,0);
        }
    }
}

广搜

#include<cstdio>
#include<queue>
using namespace std;
long long  n;
void bfs()
{
   queue<long long>Q;
   while(!Q.empty()) Q.pop();
   Q.push(1);
   while(!Q.empty())
   {
       long long now;
       now=Q.front();
       Q.pop();
       if(now%n==0)
       {
           printf("%I64d\n",now);
           return;
       }
        Q.push(now*10);
        Q.push(now*10+1);
   }
}

int main()
{
    while(~scanf("%I64d",&n)&&n)
    {
        bfs();
    }
}

你可能感兴趣的:(搜索,DFS)