Guest User

Untitled

a guest
Aug 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <cstdlib>
  5. #include <climits>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <limits>
  9. #include <bitset>
  10. #include <locale>
  11. #include <cstdio>
  12. #include <vector>
  13. #include <cfloat>
  14. #include <cmath>
  15. #include <stack>
  16. #include <queue>
  17. #include <deque>
  18. #include <ctime>
  19. #include <list>
  20. #include <map>
  21. #include <set>
  22.  
  23. using namespace std;
  24.  
  25. #define fi first
  26. #define se second
  27. #define mp make_pair
  28. #define pb push_back
  29. #define sz(x) (int) x.size ()
  30.  
  31. typedef pair <int, int> ii;
  32. typedef pair <int, ii> iii;
  33. typedef vector <int> vi;
  34. typedef vector <vi> vvi;
  35. typedef vector <ii> vii;
  36. typedef vector <vii> vvii;
  37.  
  38. int m, n;
  39. char mat [22][22];
  40. int d [22][22], c [11][11];
  41. int dx [] = {-1 ,0, 0, 1};
  42. int dy [] = {0, -1, 1, 0};
  43.  
  44. inline void bfs (const int &x, const int &y)
  45. {
  46. memset (d, -1, sizeof d);
  47. d [x][y] = 0;
  48. queue <ii> q;
  49. q.push (mp (x, y));
  50. while (sz (q))
  51. {
  52. ii u = q.front (); q.pop ();
  53. for (int i = 0; i < 4; ++i)
  54. {
  55. ii v (u.fi + dx [i], u.se + dy [i]);
  56. if (0 <= v.fi && v.fi < m && 0 <= v.se && v.se < n && mat [v.fi][v.se] != 'x' && d [v.fi][v.se] == -1)
  57. {
  58. d [v.fi][v.se] = d [u.fi][u.se] + 1;
  59. q.push (v);
  60. }
  61. }
  62. }
  63. }
  64.  
  65. int dp [1 << 11][11];
  66.  
  67. int main ()
  68. {
  69. while (scanf ("%d%d", &n, &m), m)
  70. {
  71. vii dust;
  72. int s;
  73. for (int i = 0; i < m; ++i)
  74. {
  75. scanf ("%s", mat [i]);
  76. for (int j = 0; j < n; ++j)
  77. if (mat [i][j] == '*' || mat [i][j] == 'o')
  78. {
  79. if (mat [i][j] == 'o') s = sz (dust);
  80. dust.pb (mp (i, j));
  81. }
  82. }
  83. int k = sz (dust);
  84. bool ok = true;
  85. for (int i = 0; i < k; ++i)
  86. for (int j = 0; j < i; ++j)
  87. {
  88. bfs (dust [i].fi, dust [i].se);
  89. if ((c [i][j] = c [j][i] = d [dust [j].fi][dust [j].se]) == -1) ok = false;
  90. }
  91. if (ok)
  92. {
  93. /*
  94. for (int i = 0; i < k; ++i)
  95. {
  96. for (int j = 0; j < k; ++j)
  97. printf ("%d ", c [i][j]);
  98. putchar ('\n');
  99. }
  100. */
  101. int f = (1 << k) - 1;
  102. for (int i = 1; i <= f; ++i)
  103. for (int j = 0; j < k; ++j)
  104. dp [i][j] = 1 << 30;
  105. dp [1 << s][s] = 0;
  106. for (int S = 1; S <= f; ++S)
  107. for (int i = 0; i < k; ++i)
  108. if (S & (1 << i))
  109. for (int j = 0; j < k; ++j)
  110. if (i != j && S & (1 << j))
  111. dp [S][i] = min (dp [S][i], dp [S - (1 << i)][j] + c [i][j]);
  112. int res = INT_MAX;
  113. for (int i = 0; i < k; ++i)
  114. if (i != s)
  115. res = min (res, dp [f][i]);
  116. printf ("%d\n", res);
  117. }
  118. else printf ("-1\n");
  119. }
  120. return 0;
  121. }
Add Comment
Please, Sign In to add comment