• P1506 拯救oibh总部(BFS洪水灌溉)


    题目:

    样例1:

    输入
    1. 4 5
    2. 00000
    3. 00*00
    4. 0*0*0
    5. 00*00
    输出
    1

     样例2:

    输入
    1. 5 5
    2. *****
    3. *0*0*
    4. **0**
    5. *0*0*
    6. *****
    输出
    5

    思路:

            洪水灌溉,思路:给该图外面包围一圈可遍历的的点,作为引流灌溉。

    BFS外围一点,即可顺流而下的灌溉下去。

    代码详解如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define endl '\n'
    8. #define YES puts("YES")
    9. #define NO puts("NO")
    10. #define mk make_pair
    11. #define x first
    12. #define y second
    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 = 2e6 + 10;
    19. using PII = pair<int,int>;
    20. int n,m;
    21. umap<int,string>g;// 地图
    22. int dx[4] = {0,0,1,-1};
    23. int dy[4] = {1,-1,0,0};
    24. inline bool isRun(int x,int y)
    25. {
    26. return (x >= 0 && x < n && y >= 0 &&y < m && g[x][y] == '0');
    27. }
    28. inline void BFS(int tx,int ty)
    29. {
    30. queueq;
    31. q.emplace(mk(tx,ty));
    32. while(q.size())
    33. {
    34. PII now = q.front();
    35. q.pop();
    36. g[now.x][now.y] = '1'; // 标记被灌溉的点
    37. for(int i = 0;i < 4;++i)
    38. {
    39. int bx = now.x + dx[i];
    40. int by = now.y + dy[i];
    41. if(isRun(bx,by))
    42. {
    43. g[bx][by] = '1'; // 标记被灌溉的点
    44. q.emplace(mk(bx,by));
    45. }
    46. }
    47. }
    48. }
    49. inline void solve()
    50. {
    51. cin >> n >> m;
    52. m += 2; // 由于建了外圈,所以宽度 +2
    53. // 建立上下外圈
    54. for(int i = 0;i < m;++i)
    55. {
    56. g[0] += "0";
    57. g[n + 1] += "0";
    58. }
    59. for(int i = 1;i <= n;++i)
    60. {
    61. // 这里是输入地图后,建立两边的外圈
    62. string s;
    63. cin >> s;
    64. g[i] = "0" + s + "0";
    65. }
    66. n += 2; // 由于建立了上下外圈,所以高 + 2
    67. BFS(0,0); // 引流灌溉
    68. // 获取未被洪水淹没的重要区域
    69. int ans = 0;
    70. for(int i = 0;i < n;++i)
    71. {
    72. for(int j = 0;j < m;++j)
    73. {
    74. if(g[i][j] == '0') ++ans;
    75. }
    76. }
    77. cout << ans << endl;
    78. }
    79. int main()
    80. {
    81. // freopen("a.txt", "r", stdin);
    82. IOS;
    83. int _t = 1;
    84. // cin >> _t;
    85. while (_t--)
    86. {
    87. solve();
    88. }
    89. return 0;
    90. }

    最后提交:

  • 相关阅读:
    【python】高斯日记
    ros2 代码风格检查
    CPU、内存、磁盘性能监控
    Scala012--Scala中的常用集合函数及操作Ⅲ
    Java:BIO、NIO、AIO
    centos7安装adb工具(拒绝抄袭)
    原码反码补码移码的介绍和计算
    【23真题】难!985难度前五名!
    二叉树题目:填充每个结点的下一个右侧结点指针 II
    Java后端开发工程师学习笔记【狂神说Java笔记】
  • 原文地址:https://blog.csdn.net/hacker_51/article/details/134291219