【经典/基础BFS+略微复杂的题意】PAT-L3-004. 肿瘤诊断

2023-10-19 06:40

本文主要是介绍【经典/基础BFS+略微复杂的题意】PAT-L3-004. 肿瘤诊断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

L3-004. 肿瘤诊断

在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环。给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积。

输入格式:

输入第一行给出4个正整数:M、N、L、T,其中M和N是每张切片的尺寸(即每张切片是一个M×N的像素矩阵。最大分辨率是1286×128);L(<=60)是切片的张数;T是一个整数阈值(若疑似肿瘤的连通体体积小于T,则该小块忽略不计)。

最后给出L张切片。每张用一个由0和1组成的M×N的矩阵表示,其中1表示疑似肿瘤的像素,0表示正常像素。由于切片厚度可以认为是一个常数,于是我们只要数连通体中1的个数就可以得到体积了。麻烦的是,可能存在多个肿瘤,这时我们只统计那些体积不小于T的。两个像素被认为是“连通的”,如果它们有一个共同的切面,如下图所示,所有6个红色的像素都与蓝色的像素连通。【这句话是重点,还有就是像素是什么鬼?!看了好长时间,最后大致看明白了!题意需要审清楚!还有就是切片的问题,题目中给的切片是摞起来一层一层的?还是在同一个平面上平着切下的呢?!——后来查了查资料原来是切片一层一层切下去的!/逃】

输出格式:

在一行中输出肿瘤的总体积。

输入样例:

......


 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<set>
 8 #include<vector>
 9 #include<string>
10 #include<stack>
11 #define  inf 0x3f3f3f3f
12 using namespace std;   //L3-004, 肿瘤诊断
13 #define N 200
14 #define ll long long
15 int mp[61][N][N];//这里不能开的太大,太小会WA,太大会炸!
16 int vis[61][N][N];
17 int dir[6][3]={ {1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}  };
18 struct node{
19     int x,y,z;
20     node(int x=0,int y=0,int z=0):x(x),y(y),z(z){}//类似Java的类的构造方法,可以让 st=node(i0,j0,k0) 直接实现!!
21 };
22 int m,n,l,T;//l表示层数,T表示阈值(表示组合成联通块的最小合格体积)
23 int bfs(int i0,int j0,int k0){//以下为bfs常规基本套路,不多解释
24     int ans=1;
25     node st,now,ne;
26     st=node(i0,j0,k0);
27     queue<node>Q;
28     Q.push(st);
29     vis[i0][j0][k0]=1;
30     while(Q.size()>0){
31         now=Q.front();
32         Q.pop();
33         for(int i=0;i<6;i++){
34             ne.x=now.x+dir[i][0];
35             ne.y=now.y+dir[i][1];
36             ne.z=now.z+dir[i][2];
37 
38             if(ne.x<1||ne.x>l||ne.y<1||ne.y>m||ne.z<1||ne.z>n)
39                 continue;
40             else if(vis[ne.x][ne.y][ne.z]==1||mp[ne.x][ne.y][ne.z]==0)
41                 continue;
42             else{
43                 vis[ne.x][ne.y][ne.z]=1;
44                 Q.push(ne);
45                 ans++;
46             }
47       }
48     }
49     return (ans>=T?ans:0);
50 }
51 int main(){
52 
53     int num;
54     scanf("%d%d%d%d",&m,&n,&l,&T);
55     for(int i=1;i<=l;i++){
56         for(int j=1;j<=m;j++){
57             for(int k=1;k<=n;k++){
58                 scanf("%d",&mp[i][j][k]);
59             }
60         }
61     }
62     memset(vis,0,sizeof(vis));
63     int ans=0;
64      for(int i=1;i<=l;i++){
65         for(int j=1;j<=m;j++){
66             for(int k=1;k<=n;k++){
67                 if(mp[i][j][k]==1&&!vis[i][j][k])//符合两个条件,即可开始
68                     ans+=bfs(i,j,k);
69             }
70         }
71     }
72     printf("%d\n",ans);
73 
74     return 0;
75 }
View Code(带点注释~~)

DFS不知道行不行,具体自行试试!

 

 

转载于:https://www.cnblogs.com/zhazhaacmer/p/8610217.html

这篇关于【经典/基础BFS+略微复杂的题意】PAT-L3-004. 肿瘤诊断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237999

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存