http://poj.org/problem?id=1426
题意 : 输入一个数n,找n的倍数m,这个m所满足的条件是,每一位数只能由0或1组成,在题目的旁边用红色的注明了Special Judge,表示一开始不懂什么意思,后来问的kkk,原来就是,样例的答案真的是样例,只要你输出符合要求的就行,不一定非要输出样例中给的。
思路 : 这个题分类其实是BFS,但在网上看了某大神博客之后瞬间用了DFS做出来了。。。

#include<iostream> #include<cstdio> using namespace std ; int mark ; void DFS(long long BB,int n ,int floor) { if(mark) return ; if(BB % n == 0) { //cout<<BB<<endl; printf("%lld ",BB) ; mark = 1 ; return ; } if(floor == 19) return ; DFS(BB*10,n,floor+1) ; DFS(BB*10+1,n,floor+1) ; } int main() { int n ; while(cin>>n) { if(n == 0) break ; mark = 0 ; DFS(1,n,1) ; } return 0 ; }
至于到19为什么就回溯了,这个的缘由我也不是很清楚,问了THH,他说是因为无论输入的n是什么,要找一个符合条件的m,都会保持在19位以内,在19位以内肯定会找出一个来
下面这个是kkk提供的方法,用的BFS,很简单的,队列存储,BFS的话,就是遍历10,11,若不符合条件,就在10后边加1位,可为1可为0,就是100或者101,在11后边再加一位,110,或者111,一直这样找下去,知道符合条件为止

#include<queue> #include<cstdio> using namespace std; int n ; void bfs() { long long m,p = 1 ; queue<long long>Q; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); for(int i = 0 ;i < 2 ;i++) { m=10*p+i; if(m%n==0) { printf("%lld ",m); return ; } Q.push(m); } } } int main() { while(~scanf("%d",&n)&&n) { if(n == 1) { printf("1 "); continue; } bfs(); } return 0; }