zoj 1530 Find The Multiple(bfs)

来源:互联网 发布:手机版电音制作软件 编辑:程序博客网 时间:2024/05/23 02:15

题意:

求n的倍数m,要求m中只能有0或者1.即构造一个只有0,1,组成的整数并且可以整除n.


YY:

本题有多种做法,dfs,bfs,dp。bfs里有数论做法和zoj 1889 1136类似。但我还是喜欢用bfs做,直观又简单。…………

我是因为要做广搜才去碰这题目的。一开始真的是没有想法,怎么搜?搜什么?

来在纸上画了个类似二叉树的01序列,貌似有点明白怎么个bfs法。

但是一开始写出的bfs太挫了。MLE,还漏掉了很多情况。

如下(吸取教训)

#include <string.h>#include <iostream>#include <queue>#include <cstdio>using namespace std;queue<long long>Q;void bfs(long long n){long long i;long long s=0;Q.push(1);while(!Q.empty ()){i=Q.front ();Q.pop ();s=s*10+i;if(s%n==0) break;Q.push (1);Q.push (0);}printf("%lld\n",s);}int main(){long long n;while(scanf("%lld",&n)!=EOF){if(n==0) break;bfs(n);}return 0;}

在无限的MLE (不断压入,使节点过多爆了空间)中偶参考了下牛人的代码,发现是直接在压入队列的时候才对s进行处理,这样避免了情况的漏考虑,

#include <string.h>#include <iostream>#include <queue>#include <cstdio>using namespace std;queue<long long>Q;void bfs(long long n){long long i;long long s=0;Q.push(1);while(!Q.empty ()){s=Q.front ();if(s%n==0) break;Q.pop ();Q.push (s*10);Q.push (s*10+1);}printf("%lld\n",s);}int main(){long long n;while(scanf("%lld",&n)!=EOF){if(n==0) break;while(!Q.empty ()) Q.pop ();bfs(n);}return 0;}

参考链接:

dfs 做法:http://hi.baidu.com/vivyli/blog/item/21b549dc3c22cba5cd1166d4.html

数论做法:http://hi.baidu.com/ly01kongjian/blog/item/d21e666f4734f5f1421694a8.html








原创粉丝点击