按下面这种书上的写***超时。
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
void BFS(int n){
queue<long long> myQueue;
myQueue.push(1);
while(!myQueue.empty()){
long long now = myQueue.front();
myQueue.pop();
if(now % n == 0){
printf("%lld\n", now);
return ;
}
myQueue.push(10 * now);
myQueue.push(10 * now + 1);
}
}
int main(){
int n;
while(scanf("%d", &n) != EOF) {
if(n == 0) break;
BFS(n);
}
return 0;
}改进:有除以n相同余数的只要遍历第一个就行,之后的可以直接跳过。
用visit[i%n]记录。
这样就不超时了,AC。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=210;
bool visit[MAXN];
void BFS(int n){
queue<long long> myQueue;
myQueue.push(1);
while(!myQueue.empty()){
long long now = myQueue.front();
myQueue.pop();
if(!visit[now % n]){
if(now % n == 0){
printf("%lld\n", now);
return ;
}
visit[now % n] = 1;
myQueue.push(10 * now);
myQueue.push(10 * now + 1);
}
}
}
int main(){
int n;
while(scanf("%d", &n) != EOF) {
if(n == 0) break;
memset(visit,0,sizeof(visit));
BFS(n);
}
return 0;
}
京公网安备 11010502036488号