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;

}

转载于:https://www.cnblogs.com/goodness/archive/2010/03/05/1678884.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值