这个BFS并不是很好想。。 最主要的一点是每个余数只会被拿出来一次更新其他余数, 然后我用d[ i ]表示
到达 i 这个余数最短需要多长,然后从高位往低位贪心,判断成立的时候忘记了如果0被ban掉了这个判断会
出问题,都想到这里了为什么没有想到直接去bfs找答案呢??? 我TM蠢爆。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> using namespace std; const int N = 2e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; int n, m, tot, vis[N], from[N], who[N], ans[N]; bool is[15]; void init() { tot = 0; memset(vis, 0, sizeof(vis)); memset(is, 0, sizeof(is)); } int main() { int cas = 1; while(scanf("%d%d", &n, &m) != EOF) { init(); for(int i = 1; i <= m; i++) { int x; scanf("%d", &x); is[x] = true; } queue<int> que; for(int i = 1; i < 10; i++) { if(is[i]) continue; if(i%n==0) { ans[tot++] = i; break; } vis[i%n] = 1; from[i%n] = 0; who[i%n] = i; que.push(i%n); } if(!tot) { while(!que.empty() && !tot) { int u = que.front(); que.pop(); for(int i = 0; i < 10; i++) { if(is[i]) continue; int v = (u*10+i)%n; if(!v) { ans[tot++] = i; while(u) { ans[tot++] = who[u]; u = from[u]; } reverse(ans, ans + tot); break; } if(vis[v]) continue; vis[v] = vis[u] + 1; from[v] = u; who[v] = i; que.push(v); } } } printf("Case %d: ", cas++); if(!tot) puts("-1"); else { for(int i = 0; i < tot; i++) printf("%d", ans[i]); puts(""); } } return 0; } /* */