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   liugoodness  阅读(632)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2010年3月 >
28 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

统计

点击右上角即可分享
微信分享提示