Advertisement
a53

Lee1

a53
Dec 22nd, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin ("lee1.in");
  6. ofstream fout ("lee1.out");
  7. int dl[4] = {0, 0, -1, 1};
  8. int dc[4] = {1, -1, 0, 0};
  9. int n, x[10], y[10], dist[10][10], yeet1, yeet2, p[10], m, d[102][102], sol[10], k;
  10. bool v[102][102];
  11.  
  12. bool ok (int i, int j) {
  13. if (i >= 1 && i <= n && j >= 1 && j <= m)
  14. return 1;
  15. return 0;
  16. }
  17.  
  18. int main()
  19. {
  20. fin >> n >> m;
  21. for (int i = 1; i <= n; i++)
  22. for (int j = 1; j <= m; j++)
  23. fin >> v[i][j];
  24. fin >> x[1] >> y[1] >> yeet1 >> yeet2;
  25. fin >> k;
  26. x[k + 2] = yeet1; y[k + 2] = yeet2;
  27. for(int i = 2; i <= k + 1; i++)
  28. fin >> x[i] >> y[i];
  29. for (int i = 1; i <= k + 2; i++) {
  30. memset(d, 0, sizeof(d));
  31. queue<pair<int, int> >q;
  32. q.push({x[i], y[i]});
  33. while (!q.empty()) {
  34. int x1 = q.front().first, y1 = q.front().second;
  35. q.pop();
  36. for (int k = 0; k < 4; k++) {
  37. int ii = x1 + dl[k];
  38. int jj = y1 + dc[k];
  39. if (!v[ii][jj] && !d[ii][jj] && (ii != x[i] || jj != y[i]) && ok(ii, jj)) {
  40. q.push({ii, jj});
  41. d[ii][jj] = d[x1][y1] + 1;;
  42. }
  43. }
  44. }
  45. for (int j = 1; j <= k + 2; j++)
  46. if (i != j)
  47. dist[i][j] = d[x[j]][y[j]];
  48. }
  49. for (int i = 1; i <= k; i++)
  50. p[i] = i + 1;
  51. int mn = 1e9;
  52. do {
  53. int aux = dist[1][p[1]];
  54. for (int i = 1; i < k; i++)
  55. aux += dist[p[i]][p[i + 1]];
  56. aux += dist[p[k]][k + 2];
  57. if (aux < mn) {
  58. for (int i = 1; i <= k; i++)
  59. sol[i] = p[i];
  60. mn = aux;
  61. }
  62. else if (aux == mn){
  63. bool ok;
  64. for (int i = 1; i <= k; i++) {
  65. if (x[p[i]] == x[sol[i]]) {
  66. if (y[p[i]] < y[sol[i]]) {
  67. ok = 1;
  68. break;
  69. }
  70. else {
  71. ok = 0;
  72. break;
  73. }
  74. }
  75. else if (x[p[i]] < x[sol[i]]) {
  76. ok = 1;
  77. break;
  78. }
  79. else if (x[p[i]] > x[sol[i]]) {
  80. ok = 0;
  81. break;
  82. }
  83. }
  84. if (ok)
  85. for (int i = 1; i <= k; i++)
  86. sol[i] = p[i];
  87. }
  88.  
  89. }while (next_permutation(p + 1, p + k + 1));
  90. fout << mn << "\n";
  91. fout << x[1] << "," << y[1] << "\n";
  92. for (int i = 1; i <= k; i++)
  93. fout << x[sol[i]] << "," << y[sol[i]] << "\n";
  94. fout << x[k + 2] << "," << y[k + 2] << "\n";
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement