POJ 1426 Find The Multiple (DFS / BFS)

题目链接:

id=1426">Find The Multiple

解析:直接从前往后搜。设当前数为k用long long保存,则下一个数不是k*10就是k*10+1

AC代码:

/*
DFS
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std; long long n;
int DEEP;
bool flag; void dfs(long long k, int deep){
if(flag) return ;
if(deep >= DEEP) return ; //。! !
if(k % n == 0){
flag = true;
printf("%lld\n", k);
return ;
}
dfs(k*10, deep+1);
dfs(k*10+1, deep+1);
} int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%lld", &n) == 1 && n){
flag = false;
for(DEEP=1; ; DEEP++){ //! 。!
if(flag) break;
dfs(1, 0);
}
}
return 0;
}

个人感觉这样的DFS的方式。事实上还是在模拟BFS。用DEEP控制搜索的深度,当第一层搜不到的时候,DEEP++,继续搜第二层。。

。。直到找到结果。

BFS还是非常好懂得~

/*
BFS
*/
#include <cstdio>
#include <queue>
using namespace std; long long n; void bfs(long long k, long long n){
queue<long long> q;
q.push(k);
while(!q.empty()){
long long x = q.front(); q.pop();
if(x % n == 0){
printf("%lld\n", x);
return ;
}
q.push(x*10);
q.push(x*10+1);
}
return ;
} int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%lld", &n) == 1 && n){
bfs(1, n);
}
return 0;
}

可是还是有个疑点,为什么就能确定在long long的范围内一定能找到解呢???有待考证

上一篇:poj 3083 Children of the Candy Corn(DFS+BFS)


下一篇:第三次组队赛 (DFS&BFS)