fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // ทิศทางการเคลื่อนที่ทั้งหมดที่เป็นไปได้ของ knight
  5. int dx[] = {2, 1, -1, -2, -2, -1, 1, 2};
  6. int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
  7.  
  8. int min_no_of_jumps(int n, int m, char **board, int sx, int sy, int tx, int ty) {
  9. if (board[sx][sy] == '#')
  10. return -1;
  11. // สร้างตารางขนาด n*m ไว้เพื่อจดระยะทางจากจุดเริ่มต้น
  12. // ตอนแรกกำหนดให้เป็น -1 เพื่อระบุว่ายังไม่เคยไปยัง node นั้น
  13. vector<vector<int>> dist(n, vector<int>(m, -1));
  14. // Breadth-first Search
  15. queue<pair<int, int>> Q;
  16. dist[sx][sy] = 0;
  17. Q.push({sx, sy});
  18. while (!Q.empty()) {
  19. int ux = Q.front().first, uy = Q.front().second;
  20. Q.pop();
  21. // กระจายไปยัง node ตามรูปแบบการเดินของ knight 8 ทิศที่เป็นไปได้
  22. for (int dir = 0; dir < 8; ++dir) {
  23. int vx = ux+dx[dir], vy = uy+dy[dir];
  24. // สามารถเดินไปได้ก็ต่อเมื่อ ไม่ออกนอกขอบตาราง และต้องไม่เดินไปยังช่องที่ห้ามเหยียบ (และจะไม่ BFS ไปยัง node ที่เคยไปแล้ว)
  25. if (vx >= 0 && vx < n && vy >= 0 && vy < m && board[vx][vy] != '#' && dist[vx][vy] == -1) {
  26. dist[vx][vy] = dist[ux][uy]+1;
  27. Q.push({vx, vy});
  28. }
  29. }
  30. }
  31. return dist[tx][ty];
  32. }
  33.  
  34.  
  35. int main()
  36. {
  37. int n, m;
  38. scanf("%d%d", &n, &m);
  39. char **B = new char*[n];
  40. for (int i = 0; i < n; ++i) {
  41. B[i] = new char[m+1];
  42. scanf(" %s", B[i]);
  43. assert(strlen(B[i]) == m);
  44. for (int j = 0; j < m; ++j)
  45. assert(B[i][j] == '.' || B[i][j] == '#');
  46. }
  47. int sx, sy, tx, ty;
  48. scanf("%d%d%d%d", &sx, &sy, &tx, &ty);
  49. assert(sx >= 0 && sx < n && sy >= 0 && sy < m);
  50. assert(tx >= 0 && tx < n && ty >= 0 && ty < m);
  51. printf("%d\n", min_no_of_jumps(n, m, B, sx, sy, tx, ty));
  52.  
  53. return 0;
  54. }
Success #stdin #stdout 0s 15240KB
stdin
6 8
##......
##..##..
...#....
.####...
...#....
#....#..
5 2
2 0
stdout
5