zoj 1530 Find The Multiple(bfs)

题意:

求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








你可能感兴趣的:(c)