题目分析:

可能是我的理解能力比较差,在读题的时候一直以为所有的切片是可以排列组合的,并不是按照输入顺序就定死的,那么这题就变得十分的复杂啦~~~~~,查看的题解之后发现所有的切片并没有所谓的自由组合的情况,而是类似与一片一片从下往上叠加在一起,形成一个三维的空间,那我们需要做的就是将所有的像素以三维数组的形式存储,然后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\n", 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\n", num);
63 return 0;
64 }

PAT天梯赛练习 L3-004 肿瘤诊断 (30分) 三维BFS的更多相关文章

  1. PAT 天梯赛 是否完全二叉搜索树   (30分)(二叉搜索树 数组)

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...

  2. PAT天梯赛练习 L3-003 社交集群 (30分) DFS搜索

    题目分析: 一共有N个编号为1~1000的人,以及一共有编号为1~1000种不同的兴趣,在题目给出1~N编号的人员每个人喜欢的兴趣的id后,要求统计出不同的人员集合的个数以及每个人员几个的人数从大到小 ...

  3. PAT甲级:1064 Complete Binary Search Tree (30分)

    PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...

  4. PAT天梯赛练习题——L3-004. 肿瘤诊断(三维连通块并查集)

    L3-004. 肿瘤诊断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶 ...

  5. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  6. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  7. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  8. PAT天梯赛L3-004 肿瘤诊断

    题目链接:点击打开链接 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积. 输入格式: 输入第一行给出4个正整数:M.N.L.T,其中M和N是每 ...

  9. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

随机推荐

  1. 【题解】「SP34013」SEUG - Seetha’s Unique Game

    这道题一看就是 贪心 . 使放的石头少,就需要石头大. 那么就可以将石头重量排序,从大到小. 这道题里面看似东西很多,但是很多东西都是没有用的.比如说:箱子的长和宽,因为题目中说「每加一个石头,水的高 ...

  2. AcWing 404. 婚礼

    大型补档计划 题目链接 根据题意,显然只有新郎这边可能存在矛盾,考虑这边怎么放即可,新娘那边的放法与这边正好相反且一一对应. 显然对于两个约束条件是一对矛盾,开始我以为可以用并查集,后来发现输出方案的 ...

  3. 题解-[NOI2005]瑰丽华尔兹

    题解-[NOI2005]瑰丽华尔兹 [NOI2005]瑰丽华尔兹 \(n\times m\) 的矩阵.以 \((x,y)\) 为起点.一共 \(k\) 段时间,每段时间为 \([s_i,t_i](t_ ...

  4. KVM初体验之virt-manager unable to connect to libvirt的处理办法

    解决方法 需要用root身份运行virt-manager

  5. 九、git学习之——git基本命令全总结

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit,完成. ...

  6. 谷歌SameSite策略

    当我新下载谷歌80.x版本的时候,访问一个系统(内嵌跳转到其他系统的iframe),跳转过去没有携带cookie,以前版本的谷歌浏览器是可以的,控制台提示SameSite策略,给阻止了cookie携带 ...

  7. web前端常用js插件

    第一款:截图插件html2Canvas.js html2是一款强大的截图插件,只需引入js文件,依照官方给定的截图方法,就能截取对应DOM区域的内容.对于有些截图出现模糊偏移的问题,网上也有一堆解决方 ...

  8. 如何更简单的使用Polly

    Polly 弹性瞬时错误处理库 Polly是一个C#实现的弹性瞬时错误处理库 它可以帮助我们做一些容错模式处理,比如: 超时与重试(Timeout and Retry) 熔断器(Circuit Bre ...

  9. SMART

    SMART原则: S(Specific):目标必须是具体的,要对标特定的工作指标,不能笼统: M(Measurable):目标必须是可衡量的,衡量的指标是数量化或者行为化的,验证这些指标的数据或者信息 ...

  10. idea导入配置SSM项目,并进行打包

    idea确实是一个功能强大的开发工具,但是配置项目太复杂,每次都要花费很长的时间在配置上. 关于SSM项目导入,配置,打包,看这篇就够了,百试不爽.