• 二维矩阵内的BFS搜索


    1.混境之地1 - 蓝桥云课 (lanqiao.cn)

    题目解读

    在思考的时候觉得传送门是个很玄幻的东西,在行走的路径上简直有无数种排列组合,我刚开始还想着怎么排列组合出来。

    后来发现,,,怎么可能是自己来排列组合,用BFS跑一遍整个矩阵。。。到达每个点,除了上下左右四个方向,如果是到了一个传送门的启动点,更新一下它的传送点的最小距离。遍历过程中,若存在一个方案使得到达的点的距离更小,则更新距离并将该点入队,更新其他点。

    问题还来到了,如何知道一个点是不是传送门的启动点。由于题目说一个点只能是一个门的启动点,所以可以用两个矩阵来存储和查找传送门的信息。

    优化

    使用Djikstra算法进行优化,确保每个点一经确定便不用再更新,使用优先队列实现。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. /*struct node{
    8. int x,y,p;
    9. };*/
    10. /*struct xy{
    11. int x,y;
    12. operator < (const xy &u)const {
    13. if(x==u.x){
    14. return y < u.y;
    15. }
    16. else return x < u.x;
    17. }
    18. };*/
    19. int n,m;
    20. int a,b,c,d;
    21. char g[55][55];
    22. int k;
    23. //map mm;
    24. int pp[55][55];
    25. pair<int,int> xy[55][55];
    26. int E;
    27. int l[55][55];
    28. int xt[4] = {-1,1,0,0};
    29. int yt[4] = {0,0,-1,1};
    30. void bfs(){
    31. queueint,int>> q;
    32. l[a][b] = 0;
    33. q.push({a,b});
    34. while(!q.empty()){
    35. auto t = q.front();
    36. //cout << t.first << ' ' << t.second << '\n';
    37. q.pop();
    38. if(pp[t.first][t.second]){
    39. int xf = xy[t.first][t.second].first;
    40. int yf = xy[t.first][t.second].second;
    41. if(l[t.first][t.second] + pp[t.first][t.second] < l[xf][yf]){
    42. l[xf][yf] = l[t.first][t.second] + pp[t.first][t.second];
    43. q.push({xf,yf});
    44. //if(xf==1 && yf == 5) cout << l[xf][yf] << "=\n";
    45. }
    46. }
    47. for(int i=0 ; i < 4 ; i++){
    48. int xx = t.first + xt[i];
    49. int yy = t.second + yt[i];
    50. if(xx <= n && xx >= 1 && yy >= 1 && yy <= m && g[xx][yy]!= '#'){
    51. //xy tt = {xx,yy};
    52. if(l[t.first][t.second] + 1 < l[xx][yy]){
    53. l[xx][yy] = l[t.first][t.second] + 1;
    54. q.push({xx,yy});
    55. //if(xx==1 && yy == 5) cout << l[xx][yy] << "=\n";
    56. }
    57. }
    58. }
    59. }
    60. return ;
    61. }
    62. int main()
    63. {
    64. cin >> n >> m;
    65. cin >> a >> b >> c >> d;
    66. for(int i = 1 ; i<=n ; i++){
    67. for(int j = 1 ; j <= m ; j++){
    68. cin >> g[i][j];
    69. }
    70. }
    71. cin >> k;
    72. cout << k << '\n';
    73. for(int i = 1 ; i <= k ; i++){
    74. int x1,y1,x2,y2,p;
    75. cin >> x1 >> y1 >> x2 >> y2 >> p;
    76. //mm[{x1,y1}] = {x2,y2,p};
    77. pp[x1][y1] = p;
    78. xy[x1][y1] = {x2,y2};
    79. //cout << "-------\n";
    80. }
    81. cin >> E;
    82. memset(l,0x3f,sizeof(l));
    83. bfs();
    84. //cout << "=========\n";
    85. /*for(int i = 1 ; i<=n ; i++){
    86. for(int j = 1 ; j <= m ; j++){
    87. cout << l[i][j] << ' ';
    88. }
    89. cout << '\n';
    90. }*/
    91. if(l[c][d] > E) {
    92. cout << -1;
    93. }
    94. else {
    95. cout << E - l[c][d];
    96. }
    97. return 0;
    98. }

  • 相关阅读:
    【openstack】cloudkitty组件,入门级安装(快速)
    基于51单片机智能IC卡燃气表控制(仿真+源程序+全套资料)
    【操作系统】文件管理(六)—— 文件存储空间管理
    Tensor Core的WMMA API编程入门
    手把手教你构建一个前端路由
    软考之系统安全理论基础+例题
    计算机网络期末复习-Part2
    聊聊TraceIdPatternLogbackLayout
    蓝牙 - 关于BLE的安全连接
    ANSVC无功补偿装置助力江苏某环保能源项目
  • 原文地址:https://blog.csdn.net/weixin_73512213/article/details/136390379