题目

image.png

思路

  • 经典的BFS,因为题目需要求搜索最短路径,所以下意识想到BFS
  • 将一个坐标作为一个节点去建立树,重复的节点就不放到树当中了,最少的次数能跳到某坐标,那么该次数就是坐标的层数。
  • 通过map<pair, int>的结构去记录每个坐标的次序,同时防止重复遍历。
  • printf如何保证左对齐,需要留心一下。

    代码

    ```cpp

    include

    include

    include

using namespace std;

int main() { map, int> recordSteps; int n, m, x, y; cin >> n >> m >> x >> y;

  1. // 题目从1开始计数的
  2. x--;
  3. y--;
  4. queue<pair<int, int>> q;
  5. q.push(make_pair(x, y));
  6. recordSteps[make_pair(x, y)] = 0;
  7. int dx[8] = {1, 2, -1, -2, 1, 2, -1, -2};
  8. int dy[8] = {2, 1, -2, -1, -2, -1, 2, 1};
  9. while (!q.empty()) {
  10. for (int i = 0, q_size = q.size(); i < q_size; i++) {
  11. pair<int, int> cur = q.front();
  12. q.pop();
  13. for (int j = 0; j < 8; j++) {
  14. int x = cur.first, y = cur.second;
  15. int nx = cur.first + dx[j];
  16. int ny = cur.second + dy[j];
  17. if (nx >= 0 && nx < n && ny >= 0 && ny < m && !recordSteps.count(make_pair(nx, ny))) {
  18. q.push(make_pair(nx, ny));
  19. recordSteps[make_pair(nx, ny)] = recordSteps[make_pair(x, y)] + 1;
  20. }
  21. }
  22. }
  23. }
  24. for (int i = 0; i < n; i++) {
  25. for (int j = 0; j < m; j++) {
  26. if (recordSteps.count(make_pair(i, j)) == 0) {
  27. printf("%-5d", -1);
  28. } else {
  29. printf("%-5d", recordSteps[make_pair(i, j)]);
  30. }
  31. }
  32. cout << endl;
  33. }
  34. return 0;

} ```