Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. // Noic - Semana 50 - Intermediário - Problema 2
  2. // Complexidade: O(N * log_10 N)
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. const int maxn = 10010;
  9.  
  10. int dist[maxn];
  11.  
  12. bool mark[maxn];
  13.  
  14. vector<int> grafo[maxn];
  15.  
  16. // inverso de um número x qualquer
  17. int inverso(int x)
  18. {
  19. // guardaremos os dígitos de x neste vetor
  20. vector<int> digits;
  21.  
  22. while (x > 0)
  23. {
  24. int d = x%10; // o último dígito de x é x%10
  25. x /= 10; // divimos x por 10 para encontrar os próximos dígitos
  26.  
  27. digits.push_back(d);
  28. }
  29.  
  30. // vamos percorrer os dígitos em ordem contrária
  31. reverse(digits.begin(), digits.end());
  32.  
  33. int y = 0; // resposta
  34.  
  35. for (int i = 0; i < digits.size(); i++)
  36. {
  37. // multiplicamos cada dígito pela sua respectiva potência de 10
  38. // (na ordem contrária de x)
  39. y += (pow(10, i)*digits[i]);
  40. }
  41.  
  42. return y;
  43. }
  44.  
  45. // menor distância de A para B
  46. int bfs(int a, int b)
  47. {
  48. queue<int> fila;
  49. fila.push(a);
  50.  
  51. mark[a] = 1; // mark marca os vértices já visitados
  52. dist[a] = 0;
  53.  
  54. while (!fila.empty())
  55. {
  56. int x = fila.front();
  57. fila.pop();
  58.  
  59. for (auto v: grafo[x])
  60. {
  61. if (!mark[v])
  62. {
  63. dist[v] = dist[x]+1, mark[v] = 1;
  64. fila.push(v);
  65. }
  66. }
  67. }
  68. return dist[b]-dist[a];
  69. }
  70.  
  71. int main(void)
  72. {
  73. int a, b, t;
  74. scanf("%d", &t);
  75.  
  76. while (t--)
  77. {
  78. int a, b;
  79. scanf("%d %d", &a, &b);
  80.  
  81. for (int i = 1; i <= 10000; i++)
  82. grafo[i].clear();
  83.  
  84. for (int i = 1; i <= 10000; i++)
  85. {
  86. // arestas do grafo
  87. grafo[i].push_back(i+1);
  88. grafo[i].push_back(inverso(i));
  89. }
  90.  
  91. memset(mark, 0, sizeof mark);
  92.  
  93. printf("%d\n", bfs(a, b));
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement