• BFS专题8 中国象棋-马-无障碍


    题目:

    样例:

    输入
    3 3 2 1
    输出
    1. 3 2 1
    2. 0 -1 4
    3. 3 2 1

    思路:

            单纯的BFS走一遍即可,只是方向坐标的移动变化,需要变化一下。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define endl '\n'
    8. #define x first
    9. #define y second
    10. #define mk make_pair
    11. #define YES puts("YES")
    12. #define NO puts("NO")
    13. #define umap unordered_map
    14. #define All(x) x.begin(),x.end()
    15. #pragma GCC optimize(3,"Ofast","inline")
    16. #define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
    17. using namespace std;
    18. const int N = 500;
    19. using PII = pair<int,int>;
    20. // 象棋走动的方向
    21. int dx[8] = {2,2,-2,-2,1,-1,1,-1};
    22. int dy[8] = {1,-1,1,-1,2,2,-2,-2};
    23. int g[N][N],n,m; // 象棋棋盘以及大小
    24. bool st[N][N]; // 标记是否走过当前坐标
    25. PII now; // 当前象棋坐标
    26. inline bool isRun(int &x,int &y)
    27. {
    28. return (x > 0 && x <= n && y > 0 && y <= m && !st[x][y]);
    29. }
    30. inline void BFS()
    31. {
    32. // 初始化坐标所对应的最少步数
    33. memset(g,-1,sizeof g);
    34. g[now.x][now.y] = 0; // 初始化起点步数为 0
    35. int step = 0;
    36. queueq;
    37. q.emplace(now);
    38. while(q.size())
    39. {
    40. int sz = q.size();
    41. while(sz--)
    42. {
    43. PII tem = q.front();
    44. q.pop(); // 取出当前坐标
    45. st[tem.x][tem.y] = true; // 标记当前坐标
    46. g[tem.x][tem.y] = step; // 存储当前坐标所对应的最少步数
    47. // 尝试往各个方向坐标走动
    48. for(int i = 0;i < 8;++i)
    49. {
    50. int bx = tem.x + dx[i];
    51. int by = tem.y + dy[i];
    52. if(isRun(bx,by))
    53. {
    54. // 如果符合走动条件
    55. // 存储下一个走动的坐标,并标记
    56. q.emplace(mk(bx,by));
    57. st[bx][by] = true;
    58. }
    59. }
    60. }
    61. ++step;
    62. }
    63. }
    64. // 打印棋盘各个坐标所对应的最少步数
    65. inline void PrintG()
    66. {
    67. for(int i = 1;i <= n;++i)
    68. {
    69. for(int j = 1;j <= m;++j)
    70. {
    71. if(j > 1) cout << ' '; // 控制输入格式
    72. cout << g[i][j];
    73. }
    74. cout << endl;
    75. }
    76. }
    77. inline void solve()
    78. {
    79. cin >> n >> m >> now.x >> now.y; // 输入所对应的信息
    80. BFS(); // BFS 搜索各个坐标所对应的最少步数
    81. PrintG(); // 输出答案
    82. }
    83. int main()
    84. {
    85. // freopen("a.txt", "r", stdin);
    86. IOS;
    87. int _t = 1;
    88. // cin >> _t;
    89. while (_t--)
    90. {
    91. solve();
    92. }
    93. return 0;
    94. }

    最后提交:

  • 相关阅读:
    maven集成nexus伺服服务实现项目快速自动化构建与发布
    uwb人员定位系统:人员轨迹实时定位
    如何防止服务器网站被黑
    Opencv项目实战:06 文档扫描仪
    林业数据可视化新篇章:山海鲸软件看板设计心得
    产品经理需要熟悉的网站
    LCD屏硬件调光的几种方式
    Games104现代游戏引擎入门-lecture13游戏引擎的引擎工具链基础
    青岛大学数据结构与算法——第2章
    关于AD9777芯片的说明以及FPGA控制实现 I
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/133942254