POJ-1426-Find the multiply
Posted xyqxyq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-1426-Find the multiply相关的知识,希望对你有一定的参考价值。
这题深搜广搜都可以做,深搜的做法就是把每个由1 和 0 组成的数字拓展10倍以及拓展10倍+1,然后压入队列。
这样可以走过所有由10组成的数字,且两个方向平行发展(*10 +0和+1)。
bfs
#include <cstdio> #include <queue> using namespace std; long long n, m; void bfs() { queue<long long> q; q.push(1); while (!q.empty()) { long long k = q.front(); if (k%n==0) { m = k; break; } q.pop(); q.push(k * 10); q.push(k * 10 + 1); } } int main() { while (scanf("%lld",&n)&&n) { bfs(); printf("%lld ", m); } return 0; }
dfs的话,我们就要考虑这个数是不是会超范围,long long是64位的,然后有符号类型的最大十进制数是19位的,所以当我们搜到
18位的时候,我们就可以退出了,因为这个方向搜不到,另外的一个+1方向肯定搜得到。
当我们搜到之后,要把flag标记为1,然后让所有的递归都退出,然后也是每次每个数都向两个方向搜索,不过就是单个数是先搜到
18位数字为顶,然后才返回,在没找到这个数的情况下。
dfs
#include <cstdio> #include <queue> using namespace std; long long n, m, f; void dfs(long long k,int bit) { if (f==1) return; if (k%n==0) { m = k; f = 1; return; } if (bit==18) return; dfs(k * 10,bit+1); dfs(k * 10 + 1,bit+1); } int main() { while (scanf("%lld",&n)&&n) { f = 0; dfs(1,0); printf("%lld ", m); } return 0; }
以上是关于POJ-1426-Find the multiply的主要内容,如果未能解决你的问题,请参考以下文章
广搜+打表 POJ 1426 Find The Multiple