[关闭]
@guxier 2022-03-24T11:20:31.000000Z 字数 1624 阅读 318

洛谷-P1443 马的遍历

洛谷


原题链接

题目描述

有一个 n×mn \times mn×m 的棋盘,在某个点 (x,y)(x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为

输出格式

一个 的矩阵,代表马到达某个点最少要走几步(左对齐,宽 5 格,不能到达则输出 −1)。
输入输出样例

输入 #1

  1. 3 3 1 1

输出 #1

  1. 0 3 2
  2. 3 -1 1
  3. 2 1 4

说明/提示

数据规模与约定

对于全部的测试点,保证


算法1

结果

(BFS)

从当前位置出发能到达的所有点的坐标入队,并记录步数。
递推至队空也就是说,没有位置可以再走了,或者都已经走过了。

关于DFS和BFS

Luogu_BFS.png
BFS专门用于解决求两点之间最短路的问题,而DFS是用来解决求一个点到另一个点路径总数的问题。

C++ 代码

  1. #include <cstdio>
  2. #include <vector>
  3. #include <queue>
  4. #include <cstring>
  5. #include <map>
  6. #include <set>
  7. #include <cmath>
  8. #include <iostream>
  9. #include <algorithm>
  10. #define ios ios::sync_with_stdio(false), cin.tie(0)
  11. #define sd(n) scanf("%d", &n)
  12. #define rep(i, a, n) for (int i = a; i <= n; i++)
  13. #define per(i, a, n) for (int i = n; i >= a; i--)
  14. #define fs first
  15. #define se second
  16. #define debug(x) cout << #x << ": " << x << endl
  17. #define MOD 1000000007
  18. #define INF 0x3f3f3f3f
  19. typedef long long ll;
  20. using namespace std;
  21. const int N = 1e3 + 10;
  22. int n, m, x, y, ans[N][N];
  23. bool st[N][N];
  24. int mx[9] = {0,-1,-2,-2,-1,1,2,2,1} ,my[9] = {0,-2,-1,1,2,2,1,-1,-2};
  25. queue<int> qx, qy, qs;
  26. /*
  27. 对当前位置能到达的所有点的坐标入队,并记录步数。
  28. 递推至队空也就是说,没有位置可以再走了,或者都已经走过了。
  29. */
  30. inline void check(int num) //输出
  31. {
  32. cout << num;
  33. if(num >= 10000) ;
  34. else if(num >= 1000) cout << " ";
  35. else if(num >= 100) cout << " ";
  36. else if(num >= 10) cout << " ";
  37. else if(num >= 0) cout << " ";
  38. else if(num == -1) cout << " ";
  39. }
  40. void bfs()
  41. {
  42. while(!qx.empty())
  43. {
  44. int a = qx.front();
  45. int b = qy.front();
  46. int t = qs.front();
  47. ans[a][b] = t;
  48. qx.pop();qy.pop();qs.pop();
  49. rep(i, 1, 8)
  50. {
  51. if(a + mx[i] >= 1 && a+mx[i] <= n && b+my[i] >= 1 && b+my[i] <= m && !st[a+mx[i]][b+my[i]])
  52. {
  53. st[a + mx[i]][b + my[i]] = 1;
  54. qx.push(a + mx[i]);
  55. qy.push(b + my[i]);
  56. qs.push(t + 1);
  57. }
  58. }
  59. }
  60. }
  61. int main()
  62. {
  63. ios;
  64. cin >> n >> m >> x >> y;
  65. memset(ans, -1 , sizeof ans);
  66. st[x][y] = 1;
  67. qx.push(x);
  68. qy.push(y);
  69. qs.push(0);
  70. bfs();
  71. rep(i, 1, n)
  72. {
  73. rep(j ,1, m) check(ans[i][j]);
  74. cout << endl;
  75. }
  76. return 0;
  77. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注