题目分析:

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

    第一步 安装 npm install --save-dev @babel/plugin-proposal-optional-chaining 然后在.babelrc.js文件夹里进行配置 plugin ...

  2. Bootstrap 的基本使用

    一.Bootstrap简介 Bootstrap 是目前受欢迎的前端框架之一,是基于HTML,CSS,JavaScript的,它简洁灵活,使web开发更加快捷 中文官网:http://www.bootc ...

  3. 20201128-2 【自动化办公】读写csv文件

    Exercise 1 import csv # 设置员工发展基金确认表路径 source_path = './员工发展基金确认表.csv' # 设置存放拆分结果文件的文件夹路径 result_path ...

  4. 浏览器小程序(Browser Applet)闪亮登场

    2017 年 1 月 9 日,微信小程序横空出世.随后,支付宝小程序.今日头条小程序.百度智能小程序.360小程序等纷纷推出,自此国内软件功能扩展领域进入到了小程序时代,小程序为丰富其宿主软件的功能和 ...

  5. Security篇:RememberMe

    RememberMe功能 rememberMeServices接口 有AbstractRememberMeServices抽象类 PersistentTokenBasedRememberMeServi ...

  6. 容器编排系统之K8s资源标签、标签选择器、资源注解

    前文我们聊到了使用k8s资源配置清单定义资源的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14132890.html:今天我们来聊下资源标签,标签选 ...

  7. DVWA-文件包含-目录遍历学习笔记

    参考文献资料: https://www.cnblogs.com/s0ky1xd/p/5823685.html https://www.cnblogs.com/yuzly/p/10799486.html ...

  8. 如何在Ubuntu Server 18.04 LTS中配置静态IP地址

    安装Ubuntu Server 18.04后需要分配一个的静态IP地址.先前的LTS版本Ubuntu 16.04使用/etc/network/interfaces文件配置静态IP地址,但是Ubuntu ...

  9. 纯Python绘制艺术感满满的山脊地图,创意满分

    1 简介 下面的这幅图是英国摇滚乐队 Joy Division 在1979年发行的其第一张录音室专辑 Unknown Pleasures 的封面,由艺术家 Peter Saville 基于射电脉冲星信 ...

  10. iOS 调用系统拍照遇到的坑

    iOS 11之前用的一套图片选择器框架,之前一直没问题,iOS11之后拍照后回调失败......,打断点方法完全执行,也能回调成功:但是去掉断点又恢复不能会调的问题.困扰了一下午,愣是没有解决.后来把 ...