• 迷宫 蓝桥杯


    问题描述

    这天, 小明在玩迷宫游戏

    迷宫为一个 n×n 的网格图, 小明可以在格子中移动, 左上角为 (1,1), 右下角 (n, n)为终点。迷宫中除了可以向上下左右四个方向移动一格以外, 还有 m 个双向传送门可以使用, 传送门可以连接两个任意格子。

    假如小明处在格子(x1​,y1​), 同时有一个传送门连接了格子(x1​,y1​) 和 (x2​,y2​), 那么小明既可以花费 1 的步数向上下左右四个方向之一走一格 (不能越过边界), 也可以花费 1 的步数通过传送门走到格子 (x2​,y2​) 去。

    而对于同一个迷宫, 小明每次进入的初始格子是在这n×n 个格子中均匀随 机的 (当然运气好可以直接随机到终点), 他想知道从初始格子走到终点的最短 步数的期望值是多少。

    输入格式

    输入共 1+m 行, 第一行为两个正整数 n,m 。

    后面 mm 行, 每行四个正整数 xi1​,yi1​,xi2​,yi2​ 表示第 i 个传送门连接的两个格子坐标。

    输出格式

    输出共一行, 一个浮点数表示答案 (请保留两位小数)。

    样例输入

    1. 2 1
    2. 1 1 2 2

    样例输出

    0.75
    

    反向搜索  只要搜一次就行

    另外本题不标记 因为传送门会使之前的结果不一定是最优的。增加了空间复杂度。

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=2e3+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int dx[]={0,0,1,-1};
    11. int dy[]={1,-1,0,0};
    12. int n,m;
    13. int dist[N][N];
    14. vector<PII>door[N][N];
    15. bool is_door[N][N];
    16. void bfs()
    17. {
    18. memset(dist,0x3f,sizeof dist);
    19. dist[n][n]=0;
    20. queue<PII>q;
    21. q.push({n,n});
    22. while(q.size())
    23. {
    24. auto t=q.front();
    25. q.pop();
    26. for(int p=0;p<4;p++)
    27. {
    28. int X=dx[p]+t.first,Y=dy[p]+t.second;
    29. if(X<1||X>n||Y<1||Y>n) continue;
    30. if(dist[X][Y]>dist[t.first][t.second]+1)
    31. {
    32. dist[X][Y]=dist[t.first][t.second]+1;
    33. q.push({X,Y});
    34. }
    35. if(is_door[t.first][t.second])//如果当前点可以使用传送门
    36. {
    37. //因为是反向搜图,可以多对一
    38. for(auto s:door[t.first][t.second])
    39. {
    40. //取出里面的点
    41. if(dist[s.first][s.second]>dist[t.first][t.second]+1)
    42. {
    43. dist[s.first][s.second]=dist[t.first][t.second]+1;
    44. q.push({s.first,s.second});
    45. }
    46. }
    47. }
    48. }
    49. }
    50. }
    51. signed main()
    52. {
    53. cin>>n>>m;
    54. for(int i=1;i<=m;i++)
    55. {
    56. int a,b,c,d;
    57. cin>>a>>b>>c>>d;
    58. door[a][b].push_back({c,d});
    59. door[c][d].push_back({a,b});
    60. is_door[a][b]=is_door[c][d]=true;
    61. }
    62. bfs();
    63. int sum=0;
    64. for(int i=1;i<=n;i++)
    65. {
    66. for(int j=1;j<=n;j++)
    67. {
    68. sum+=dist[i][j];
    69. }
    70. }
    71. cout<<fixed<<setprecision(2)<<1.0*sum/(n*n)<<"\n";
    72. return 0;
    73. }

  • 相关阅读:
    人工智能自学需要学什么?
    Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]
    数组的存储结构、特殊矩阵和稀疏矩阵的压缩存储
    静态顺序表及基本操作具体实现
    Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子园林智能监测解决方案
    Docker笔记-概念&安装&简单使用
    18.项目开发之前端项目搭建测试
    算法-算法的基本框架思想
    基于C语言的词法分析程序的设计与实现
    使用脚本安装mysql
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/133579662