按下面这种书上的写***超时。
#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; }