zoukankan      html  css  js  c++  java
  • PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS

    题目分析:

    可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合的情况,而是类似与一片一片从下往上叠加在一起,形成一个三维的空间,那我们需要做的就是将所有的像素以三维数组的形式存储,然后bfs所有像素为1的点,只要相连的6个方向中有1则继续bfs,每次搜索过的1像素点都清零,避免重复搜索,在bfs的过程中统计相连的1的个数,每次bfs结束时比较sum和阈值的大小,并加入总体积

    代码:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<cmath>
     5 #include<set>
     6 #include<queue>
     7 #include<vector>
     8 using namespace std;
     9 
    10 int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}}; //x轴 y轴 z轴 
    11 int a[65][130][1300];
    12 int n, m, l, t;
    13 int area = 0;
    14 struct Node{
    15     int x, y, z;
    16 }; 
    17 
    18 bool judge(int x, int y, int z){
    19     if(x < 0 || x > l || y < 0 || y > n || z < 0 || z > m) return false;
    20     else return true;    
    21 }
    22 
    23 void bfs(int x, int y, int z){
    24     queue<Node> q;
    25     int sum = 1;
    26     Node temp;
    27     temp.x = x; temp.y = y; temp.z = z;
    28     a[x][y][z] = 0;        //搜索过的像素清零
    29     q.push(temp);
    30     while(!q.empty()){
    31         temp = q.front();
    32         q.pop();
    33         for(int i = 0; i < 6; i++){
    34             Node now;
    35             now.x = temp.x + dir[i][0];
    36             now.y = temp.y + dir[i][1];
    37             now.z = temp.z + dir[i][2];
    38             if(judge(now.x, now.y, now.z) && a[now.x][now.y][now.z]){
    39                 a[now.x][now.y][now.z] = 0;
    40                 sum++;
    41                 q.push(now);
    42             }
    43         }
    44     } 
    45     if(sum >= t) area += sum;
    46 }
    47 
    48 int main(){
    49     scanf("%d%d%d%d", &n, &m, &l, &t);
    50     for(int i = 1; i <= l; i++){
    51         for(int j = 1; j <= n; j++){
    52             for(int k = 1; k <= m; k++){
    53                 scanf("%d", &a[i][j][k]);
    54             }
    55         }
    56     }
    57     for(int i = 1; i <= l; i++){
    58         for(int j = 1; j <= n; j++){
    59             for(int k = 1; k <= m; k++){
    60                 if(a[i][j][k]) bfs(i, j, k);
    61             }
    62         }
    63     }
    64     printf("%d
    ", area);
    65     return 0;
    66 } 

     回顾:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<queue>
     4 #include<string.h>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 int mat[65][1300][130];
     9 int dir[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 0, 1}, {0, 0, -1}, {0, 1, 0}, {0, -1, 0}};
    10 int m, n, l, t;
    11 int num;
    12 struct Node{
    13     int x, y, z;
    14 };
    15 
    16 void bfs(int x, int y, int z){
    17     queue<Node> q;
    18     Node temp;
    19     temp.x = x; temp.y = y; temp.z = z;
    20     mat[x][y][z] = 0;
    21     q.push(temp); 
    22     int sum = 1;
    23     while(!q.empty()){
    24         temp = q.front();
    25         q.pop();
    26         for(int i = 0; i < 6; i++){
    27             int fx = dir[i][0] + temp.x;
    28             int fy = dir[i][1] + temp.y;
    29             int fz = dir[i][2] + temp.z;
    30             if(fx >= 1 && fx <= l && fy >= 1 && fy <= m && fz >= 1 && fz <= n){
    31                 if(mat[fx][fy][fz] == 1){
    32                     mat[fx][fy][fz] = 0;
    33                     sum++;
    34                     Node next;
    35                     next.x = fx; next.y = fy; next.z = fz;
    36                     q.push(next);
    37                 }
    38             }
    39         }
    40     }
    41     if(sum >= t) num += sum;
    42 }
    43 
    44 int main(){
    45     scanf("%d%d%d%d", &m, &n, &l, &t);
    46     for(int i = 1; i <= l; i++){
    47         for(int j = 1; j <= m; j++){
    48             for(int k = 1; k <= n; k++){
    49                 scanf("%d", &mat[i][j][k]);
    50             }
    51         }
    52     }
    53     for(int i = 1; i <= l; i++){
    54         for(int j = 1; j <= m; j++){
    55             for(int k = 1; k <= n; k++){
    56                 if(mat[i][j][k] == 1){
    57                     bfs(i, j, k); 
    58                 }
    59             }
    60         }
    61     }
    62     printf("%d
    ", num);
    63     return 0;
    64 } 
  • 相关阅读:
    webservice接口示例(spring+xfire+webservice)
    SoapUI 测试接口演示
    XML 文档结构必须从头至尾包含在同一个实体内
    Oracle url编码与解码
    【中山市选2010】【BZOJ2467】生成树
    synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
    自己动手写搜索引擎
    PopupWindow底部弹出
    JAVA集合类型(二)
    双卡手机发送短信
  • 原文地址:https://www.cnblogs.com/YLTFY1998/p/12249135.html
Copyright © 2011-2022 走看看