标签:范围 space 退出 scanf col 情况下 push 个数 情况
这题深搜广搜都可以做,深搜的做法就是把每个由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\n", 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\n", m); } return 0; }
标签:范围 space 退出 scanf col 情况下 push 个数 情况
原文地址:https://www.cnblogs.com/xyqxyq/p/10405740.html