地址 https://algospot.com/judge/problem/read/CHILDRENDAY
题解
ac代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 #include <string> 5 #include <vector> 6 7 using namespace std; 8 9 10 //当前顶点的序号为here时 11 //经过序号为edge的边线能到达的顶点序号是多少 12 int append(int here, int edge, int mod) 13 { 14 int there = here * 10 + edge; 15 if (there >= mod) return mod + there % mod; 16 return there % mod; 17 } 18 19 //找出仅由digits内的数组组成 20 //且满足C mod n == m的最小的C 21 string gifts(string digits, int n, int m) 22 { 23 //如果按照升序排列边线序号 24 //就能找出按照字典顺序排在最前面的路径 25 sort(digits.begin(),digits.end()); 26 27 //白色顶点i表示为0号~n-1号的顶点 灰色顶点i表示为n号~2n-1号的顶点 28 //parent[i]=BFS生成树中顶点i的父节点 29 //choice[i]=从parent[i]连向i的边线序号 30 vector<int> parent(2 * n, -1), choice(2 * n, -1); 31 queue<int> q; 32 //将白色0号加入队列 33 parent[0] = 0; 34 q.push(0); 35 while (!q.empty()) { 36 int here = q.front(); 37 q.pop(); 38 for (int i = 0; i < digits.size(); i++) { 39 //跟踪边线digits[i[-'0' 40 int there = append(here, digits[i] - '0', n); 41 if (parent[there] == -1) { 42 parent[there] = here; 43 choice[there] = digits[i] - '0'; 44 q.push(there); 45 } 46 } 47 } 48 49 //未能达到灰色m号 则失败! 50 if (parent[n + m] == -1) return "IMPOSSIBLE"; 51 //跟踪连向父节点的路径并计算C 52 string ret; 53 int here = n + m; 54 while (parent[here] != here) { 55 ret += char('0' + choice[here]); 56 here = parent[here]; 57 } 58 reverse(ret.begin(), ret.end()); 59 return ret; 60 } 61 62 63 int main() 64 { 65 int n; 66 cin >> n; 67 while (n--) { 68 string s; 69 int a, b; 70 cin >> s >> a >> b; 71 72 cout << gifts(s, a, b) << endl; 73 } 74 }