Разбор решения
Цифры на диске идут от стопора так:
Цифра x доступна, если x ≠ 0 и x ≤ d.
Если d = 0, доступно всё: 0 — самая дальняя цифра.
Вершины — номера, рёбра — пары «общаются». Пример, d = 9:
Жёлтый — врач. Набрать можно только номера без нуля.
Номер врача набирается → звоним напрямую: 1 звонок
Иначе выбираем знакомого v, которого можем набрать:
Щукин → v → … → врач → Щукин
Выгоднее всего ближайший к врачу набираемый v — BFS находит его первым.
В примере: v = 1987629, 1 + 2 + 1 = 4
bool canDial(const string& number) { if (d == 0) return true; for (char c : number) if (c == '0' || c - '0' > d) return false; return true; } map<string, vector<string>> graph; // graph[a].push_back(b) и наоборот if (canDial(doctor)) { cout << 1; return 0; } set<string> visited = {doctor}; queue<pair<string, int>> q; // номер и расстояние q.push({doctor, 0}); int dist = -1; while (!q.empty()) { auto [v, k] = q.front(); q.pop(); if (canDial(v)) { dist = k; break; } // нашли - стоп for (const string& to : graph[v]) if (!visited.count(to)) { visited.insert(to); q.push({to, k + 1}); } } if (dist == -1) cout << -1; else cout << dist + 2;
Сложность: O(n + m)