1426 Find The Multiple解题报告(深度优先搜索、广度优先搜索)

题目来源:POJ 1426 Find The Multiple

http://acm.pku.edu.cn/JudgeOnline/problem?id=1426

 

解法类型:深度优先搜索

 

作者:刘亚宁

 

题目大意:

找出任意一个n(n<=100)的倍数中只由01构成的十进制数。

 

解题思路:

以一个1为根节点,每个节点接有0和1构建一棵树,应用深度优先搜索,得到符合题意的解。

 

提交情况:

1、Compile Error一次:编译器选择问题,选择G++编译器后此问题解决。

                       2、Memory Limit Exceeded两次:应用广度优先搜索,利用string记录数字过多超内存限制。

                       3、Runtime Error一次:应用广度优先搜索,缩小数组后数组越界。

 

注意:

以下附三段代码,前两段是深度优先搜索,其中第二段更直接、省时。第三段是广度优先搜索,比较简单,利用了题目的特殊性。

 

源程序1:

#include <iostream>

 

using namespace std;

 

int n, t, a[100], ac,l;

 

void dfs(int c, int s)

{

         if(s==0)//如果余数为0,择停止递归

         {

                   ac = 1;//表示已经找到结果

                   l=c;//给数组的长度赋值

         }

         else if(c < 100)//在深度100范围内进行递归

         {

                   if(ac==0)//还没找到结果,进行递归运算

                   {

                            a[c] = 1;//尝试下一位放1

                            dfs(c + 1, (s * 10 + 1) % n);

                   }

                   if(ac==0)

                   {

                            a[c] = 0;

                            dfs(c + 1, (s * 10) % n);

                   }

         }

}

 

int main()

{

         while(cin>>n,n)

         {

                   a[0] = 1, ac = 0;//初始化

                   dfs(1, 1);

                   for(int i=0;i<l;i++) cout<<a[i];//根据递归得到的结果,进行输出

                   cout<<endl;

         }

         return 0;

}

 

源程序2:

#include <iostream>

 

using namespace std;

 

int n, t, a[100], ac;

 

void dfs(int c, int s)

{

         if(s==0&&ac==0)

         {//得到结果,直接输出

                   for(int i=0;i<c;i++) cout<<a[i];

                   cout<<endl;

                   ac = 1;//修改状态为已得到结果

         }

         else if(c < 100&&ac==0)//未得到结果且深度为100以下的前提下进行递归

         {

                   a[c] = 1;

                   dfs(c + 1, (s * 10 + 1) % n);

                   a[c] = 0;

                   dfs(c + 1, (s * 10) % n);

         }

}

 

int main()

{

         while(cin>>n,n)

         {

                   a[0] = 1, ac = 0;

                   dfs(1, 1);

         }

         return 0;

}

源程序3:

#include <iostream>

#include <cstdlib>

using namespace std;

 

long long m[2000000];//题目的特殊性,用long long就可以过。

 

int main()

{

         int n,now,tail;

         while(cin>>n,n)

         {

                   now=0;

                   tail=1;

                   m[0]=1;

                   while(1)

                   {

                            if(m[now]%n==0)

                            {

                                     cout<<m[now]<<endl;

                                     break;

                            }

                            m[tail++]=m[now]*10+1;

                            m[tail++]=m[now]*10;

                            now++;

                   }

         }

         return 0;

}

posted on 2010-03-05 10:15  liugoodness  阅读(631)  评论(0编辑  收藏  举报

导航