fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int X[4] = {-1, 1, 0, 0};
  5. int Y[4] = {0, 0, 1, -1};
  6.  
  7. int n, m;
  8. vector<vector<int>> a, vis;
  9. queue< pair<int, int> > q;
  10.  
  11. int main() {
  12. cin >> m >> n;
  13. a.resize(m);
  14. vis.resize(m);
  15. for (int i = 0; i < m; i++) {
  16. a[i].resize(n);
  17. vis[i].resize(n, -1);
  18. for (int j = 0; j < n; j++) {
  19. cin >> a[i][j];
  20. }
  21. }
  22.  
  23. int s, t, u, v;
  24.  
  25. cin >> s >> t;
  26. cin >> u >> v;
  27.  
  28. s = m - s - 1;
  29. u = m - u - 1;
  30.  
  31. // đỉnh đầu tiên được thăm là s, t
  32. // đẩy {s, t} vào queue
  33. vis[s][t] = 0;
  34. q.push({s, t});
  35.  
  36. // kiểm tra q chưa rỗng và đỉnh {u, v} chưa được thăm
  37. while (!q.empty() && vis[u][v] == -1) {
  38. // lấy đỉnh đầu tiên trong queue ra
  39. pair<int, int> top = q.front();
  40. q.pop();
  41. for (int i = 0; i < 4; i++) {
  42. // thăm các đỉnh kề với đỉnh đã lấy ra
  43. int x = top.first + X[i];
  44. int y = top.second + Y[i];
  45.  
  46. // nếu (x, y) nằm trong bảng, và (x, y) là ô đi được, (x, y) chưa được thăm
  47. // thì đẩy (x, y) vào queue
  48. if (x >= 0 && y >= 0 && x < m && y < n && vis[x][y] == -1 && a[x][y]) {
  49. q.push({x, y});
  50. vis[x][y] = vis[top.first][top.second] + 1;
  51. }
  52. }
  53. }
  54.  
  55. // thứ tự thăm của {u, v}, nếu {u, v} ko được thăm thì bằng -1
  56. cout << vis[u][v];
  57.  
  58. return 0;
  59. }
  60.  
Success #stdin #stdout 0s 5292KB
stdin
4 4
1 1 1 1
1 0 1 1
1 1 0 1
0 1 1 1
1 0
3 3
stdout
5