题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072

这题就是01小岛问题的增强版,3维增强版的BFS

漏了的几个点

  1. 增量数组一开始忘了设置了,注意一下二维和三维的增量数组形式
  2. BFS函数中的while中的for循环,里面只有一层!!!目的是循环一遍增量数组
  3. 三维数组的输入,三层循环嵌套,最外层是高度z,然后才是x,y

代码

  1. #include<algorithm>
  2. #include<queue>
  3. #include<iostream>
  4. using namespace std;
  5. struct Node{
  6. int x, y, z;
  7. }node;
  8. int m, n, l, t;
  9. int matrix[1290][135][70];
  10. int inq[1290][135][70];
  11. int X[6] = {0, 0, 0, 0, 1, -1};
  12. int Y[6] = {0, 0, 1, -1, 0, 0};
  13. int Z[6] = {1, -1, 0, 0, 0, 0};
  14. bool judge(int x, int y, int z){
  15. if(x >= m || y >= n || z >= l || x < 0 || y < 0 || z < 0) return false;
  16. if(matrix[x][y][z] == 0) return false;
  17. if(inq[x][y][z] == true) return false;
  18. return true;
  19. }
  20. int BFS(int x, int y, int z){
  21. int count = 1;
  22. queue<Node> q;
  23. node.x = x, node.y = y, node.z = z;
  24. q.push(node);
  25. inq[x][y][z] = true;
  26. while(!q.empty()){
  27. Node top = q.front();
  28. q.pop();
  29. for(int i = 0; i < 6; i++){
  30. node.x = top.x + X[i];
  31. node.y = top.y + Y[i];
  32. node.z = top.z + Z[i];
  33. if(judge(node.x, node.y, node.z)){
  34. count++;
  35. inq[node.x][node.y][node.z] = true;
  36. q.push(node);
  37. }
  38. }
  39. }
  40. return count;
  41. }
  42. int main(){
  43. scanf("%d%d%d%d", &m, &n, &l, &t);
  44. for(int k = 0; k < l; k++){
  45. for(int i = 0; i < m; i++){
  46. for(int j = 0; j < n; j++){
  47. scanf("%d", &matrix[i][j][k]);
  48. }
  49. }
  50. }
  51. int ans = 0, temp;
  52. for(int k = 0; k < l; k++){
  53. for(int i = 0; i < m; i++){
  54. for(int j = 0; j < n; j++){
  55. if(matrix[i][j][k] == 1 && inq[i][j][k] == false){
  56. temp = BFS(i, j, k);
  57. if(temp >= t) ans += temp;
  58. }
  59. }
  60. }
  61. }
  62. printf("%d",ans);
  63. return 0;
  64. }