题目分析:

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

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  2. sqli-labs less13-20(各种post型头部注入)

    less-13 POST型双查询注入 less-14 POST型双查询注入 less-15 POST型布尔注入 less-16 POST型布尔注入 less-17 POST型报错注入(updatexm ...

  3. v-once

    v-once 使用了这个指令,那么这个值将只会渲染一次,后续将不会再被更改 初始运行结果: 在控制台中分别修改他们的值: 可以看到使用了v-once指令的插值没有被修改.

  4. ASP.NET Core 中间件的使用(二):依赖注入的使用

    写在前面 上一篇大家已经粗略接触了解到.NET Core中间件的使用:ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件, .NET Core框架中很多核心对象都是通过依 ...

  5. 逆袭故事|从“点点点”到月薪17K,这个女孩子做到啦

    姓:XXX,XX VIP 学员,一名自动化测试工程师!之前在某大型培训机构转行学习软件测试时就是木子老师的学生,她也一直关注木子老师的动态,后来知道木子老师打算开设测试开发高级提升班,等开了班就报名了 ...

  6. 旁站和C段的简要解释

    旁注与C段嗅探的意义,旁注的意思就是从同台服务器上的其他网站入手,提权,然后把服务器端了,就自然把那个网站端了.C段嗅探,每个IP有ABCD四个段,举个例子,192.168.0.1,A段就是192,B ...

  7. Python中的”黑魔法“与”骚操作“

    本文主要介绍Python的高级特性:列表推导式.迭代器和生成器,是面试中经常会被问到的特性.因为生成器实现了迭代器协议,可由列表推导式来生成,所有,这三个概念作为一章来介绍,是最便于大家理解的,现在看 ...

  8. Python代码实现猜数字游戏

    1 # -*- coding:utf-8 -*- 2 # 作者:IT小学生蔡坨坨 3 # 时间:2020/12/9 23:02 4 5 # 猜数字游戏: 6 # 代码中生成一个随机整数. 7 # 然后 ...

  9. 类似818tu.c微信小说分销系统设计之多公众号网页授权自动登录源码分享

    /** 转载请保留原地址以及版权声明,请勿恶意修改 *  作者:杨浩瑞  QQ:1420213383  独立博客:http://www.yxxrui.cn * [后台]http://xiaoshuo. ...

  10. sql 中 foreach 中传入多个不同的参数问题

    <!--查找某用户绑定的药物不良反应报告列表--> <select id="selectSurveyListByUserProId" resultType=&qu ...