当前位置:   article > 正文

蓝桥杯岛屿个数dfs(已找到bug)

蓝桥杯岛屿个数dfs(已找到bug)
  1. #include <bits/stdc++.h>
  2. #define endl "\n"
  3. using namespace std;
  4. int m, n;
  5. int dx[4] = {0,-1,0,1};
  6. int dy[4] = {-1,0,1,0};
  7. int dxx[8] = {0,-1,0,1,-1,-1,1,1};
  8. int dyy[8] = {-1,0,1,0,-1,1,-1,1};
  9. int res = 0;
  10. void dfs_road(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
  11. {
  12. visited[x][y] = true;
  13. for(int i = 0;i < 4;i++)
  14. {
  15. int nextx = x + dx[i];
  16. int nexty = y + dy[i];
  17. if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
  18. if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
  19. {
  20. visited[nextx][nexty] = true;
  21. dfs_road(grid,nextx,nexty,visited);
  22. }
  23. }
  24. }
  25. //
  26. void dfs_sea(vector<vector<char>> &grid,int x,int y,vector<vector<bool>> &visited)
  27. {
  28. visited[x][y] = true;
  29. for(int i = 0;i < 8;i++)
  30. {
  31. int nextx = x + dxx[i];
  32. int nexty = y + dyy[i];
  33. if(nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size()) continue;
  34. if(!visited[nextx][nexty] && grid[nextx][nexty] == '1')
  35. {
  36. visited[nexty][nexty] = true;
  37. dfs_road(grid,nextx,nexty,visited);
  38. res++;
  39. }
  40. if(!visited[nextx][nexty] && grid[nextx][nexty] == '0')
  41. {
  42. visited[nextx][nexty] = true;
  43. dfs_sea(grid,nextx,nexty,visited);
  44. }
  45. }
  46. }
  47. void solve()
  48. {
  49. cin >> m >>n;
  50. res = 0;
  51. vector<vector<char>> grid(m,vector<char>(n));
  52. vector<vector<bool>> visited = vector<vector<bool>>(m,vector<bool>(n,false));
  53. for(int i = 0;i < m;i++)
  54. {
  55. for(int j = 0;j < n;j++)
  56. {
  57. cin >> grid[i][j];
  58. }
  59. }
  60. //从边缘遍历岛屿
  61. for(int i = 0;i < m;i++)
  62. {
  63. if(!visited[i][0] && grid[i][0] == '1')
  64. {
  65. dfs_road(grid,i,0,visited);
  66. res++;
  67. }
  68. if(!visited[i][n - 1] && grid[i][n - 1] == '1')
  69. {
  70. dfs_road(grid,i,n - 1,visited);
  71. res++;
  72. }
  73. }
  74. for(int j = 0;j < n;j++)
  75. {
  76. if(!visited[0][j] && grid[0][j] == '1')
  77. {
  78. dfs_road(grid,0,j,visited);
  79. res++;
  80. }
  81. if(!visited[m - 1][j] && grid[m - 1][j] == '1')
  82. {
  83. dfs_road(grid,m - 1,j,visited);
  84. res++;
  85. }
  86. }
  87. //从边缘的海遍历 遇见没有遍历过的陆地再做dfs
  88. for(int i = 0;i < m;i++)
  89. {
  90. if(!visited[i][0] && grid[i][0] == '0')
  91. {
  92. dfs_sea(grid,i,0,visited);
  93. }
  94. //
  95. if(!visited[i][n - 1] && grid[i][n - 1] == '0')
  96. {
  97. dfs_sea(grid,i,n - 1,visited);
  98. }
  99. }
  100. for(int j = 0;j < n;j++)
  101. {
  102. if(!visited[0][j] && grid[0][j] == '0')
  103. {
  104. dfs_sea(grid,0,j,visited);
  105. }
  106. //
  107. if(!visited[m - 1][j] && grid[m - 1][j] == '0')
  108. {
  109. dfs_sea(grid,m - 1,j,visited);
  110. }
  111. }
  112. cout << res << endl;
  113. }
  114. signed main()
  115. {
  116. ios::sync_with_stdio(0);
  117. cin.tie(0);
  118. cout.tie(0);
  119. int t = 1;
  120. cin >> t;
  121. while(t--)
  122. solve();
  123. return 0;
  124. }

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/428639
推荐阅读
相关标签
  

闽ICP备14008679号