POJ1426:Find The Multiple——BFS
题目描述
定一个n,求n的非零整数倍m,满足m的十进制表示,所有数字均为0或者1
If there are multiple solutions for a given value of n, any one of them is acceptable.
下面的样例输出根据上面这句描述,放了一个烟雾弹,样例输出给的结果非常大,但是只要输出任何一个满足条件的m即可,所有我们可以选择输出最小的
搜索四部曲
状态空间 | 状态转移 | 初始状态 | 目标状态 | |
---|---|---|---|---|
思路1 | n * k | n * k + n | n | n * k |
思路2 | 0,1构成的number | number * 10 number * 10 + 1 |
n | number % n == 0 |
思路1:暴力搜索n的所有非零整数倍m,直到找到符合要求m(十进制所有数字均为0或1)
思路2:反过来考虑,直接搜索所有0,1组成成的数number,看能否满足number % n == 0,否则继续看number0(number * 10)和number1(number * 10 + 1)
显然,思路2要比思路1更高效,搜索树如下
搜索策略选择
由于要选择最小的满足要求的m,因此可以选用BFS策略,即按层搜索
此外,由于所有的搜索结点均不会重复,因此不需要使用visit数组标记重复
代码
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
void BFS(int n){
queue<long long> q;
q.push(1);
while(!q.empty()){
long long current = q.front();
q.pop();
if(current % n == 0){
printf("%lld\n", current);
return ;
}
q.push(current * 10);
q.push(current * 10 + 1);
}
}
int main(){
int n;
while(scanf("%d", &n) != EOF){
if(n == 0){
break;
}
BFS(n);
}
return 0;
}
遇到的坑
使用STL queue提交代码时需要G++编译器,用C++则会TLE,原因不清楚,希望有大佬帮解答