专题一 简单搜索 Problem E

题目链接:http://poj.org/problem?id=1426

题目大意:给定一个不大于200的正整数n,求出它的任意一个倍数(大于等于n)。

     要求该数字 必须由0和1组成,不能出现其他数字。

解题思路:bfs搜索

     用一个数组模拟队列,每次从队首取出一个元素,判断是否满足。然后将该数字末尾加0放入队尾,将该数字末尾加1放入队尾。

     由于最高位不能为0,所以从1开始模拟(即队首元素放 1)。

代码如下:

 1 #include<cstdio>
 2 
 3 int n;
 4 __int64 Queue[10000000];//模拟队列实现过程,后期数据越来越大,不能用int
 5 
 6 void bfs()
 7 {
 8     int head=0,tail=1;//队首,队尾
 9     Queue[0]=1;//描述队首,因为最高位只能为1,不能为0,所以队列从1开始,逐渐变大
10 
11     while(head<tail)
12     {
13         __int64 x=Queue[head++];//从队首取出一个数
14 
15         if(x%n==0)//如果该数满足条件,则输出
16         {
17             printf("%I64d\n",x);
18             return;
19         }
20         Queue[tail++]=10*x;//在上一个数末尾加一个0
21         Queue[tail++]=10*x+1;//在上一个数末尾加一个
22     }
23 }
24 
25 int main()
26 {
27     while(scanf("%d",&n)!=EOF)
28     {
29         if(n==0) break;
30         bfs();
31     }
32     return 0;
33 }
View Code

 

你可能感兴趣的:(专题一 简单搜索 Problem E)