Advertisement

L3-004 肿瘤诊断 (30 分)(简单三维bfs)

阅读量:

在临床诊断肿瘤疾病的过程中, 评估肿瘤体积是一个核心步骤之一. 根据提供的病灶扫描切片中标注出的疑似肿瘤区域, 请对所标注区域进行体积评估.

输入格式:

四个正整数作为参数输入表示为M、N、L和T四个变量,并分别具有特定含义:其中M和N用于描述每个切片图像的空间分辨率(即每幅切片均为一个M×N像素矩阵),最大分辨率设置为1286×128像素;数量不超过60个的切片组由L表示;数值T设定了判断标准:当其体积低于设定值时会被跳过处理以避免误诊

请提供L张切片样本 每张切片可由一个M×N二维数组表示 其中数值为1的位置对应疑似肿瘤区域 考虑到各切片厚度一致 因此可以通过计算连通区域内的像素数量来估算体积 复杂之处在于可能存在多个独立肿瘤区域 对于每个区域大小超过或等于T的情况进行统计分析 两个像素被认为是‘连通的’ 如果它们有一个共同的切面 如下图所示 所有6个红色方块都与蓝色方块连通

输出格式:

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

输入样例:

复制代码
 3 4 5 2

    
 1 1 1 1
    
 1 1 1 1
    
 1 1 1 1
    
 0 0 1 1
    
 0 0 1 1
    
 0 0 1 1
    
 1 0 1 1
    
 0 1 0 0
    
 0 0 0 0
    
 1 0 1 1
    
 0 0 0 0
    
 0 0 0 0
    
 0 0 0 1
    
 0 0 0 1
    
 1 0 0 0

输出样例:

复制代码
    26

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

【代码】

复制代码
 #include<iostream>

    
 using namespace std;
    
 int photo[130][130][65] = { 1 };
    
 int xlist[7000000];
    
 int ylist[7000000];
    
 int zlist[7000000];
    
  
    
 int fx[6] = { 0, 0, 0, 0, 1, -1 };//方向数组
    
 int fy[6] = { 0, 0, 1, -1, 0, 0 };//方向数组
    
 int fz[6] = { 1, -1 ,0, 0, 0, 0 };//方向数组
    
  
    
 int mark = 2;
    
 int ans = 0;
    
 int n, m, l, t;
    
  
    
 int seek(int x, int y, int z)
    
 {
    
 	xlist[0] = x;
    
 	ylist[0] = y;
    
 	zlist[0] = z;
    
 	photo[x][y][z] = 2;
    
 	int count = 0;
    
 	int head = 0;
    
 	int tail = 0;
    
 	int nowx;
    
 	int nowy;
    
 	int nowz;
    
 	while (head >= tail)//队列
    
 	{
    
 		nowx = xlist[tail];
    
 		nowy = ylist[tail];
    
 		nowz = zlist[tail];
    
 		for (int i = 0; i < 6; i++)
    
 		{
    
 			int newx = nowx + fx[i];//移动
    
 			int newy = nowy + fy[i];//移动
    
 			int newz = nowz + fz[i];//移动
    
 			if (newx >= 0 && newx < m)
    
 				if (newy >= 0 && newy < n)
    
 					if (newz >= 0 && newz < l)//不超过边界
    
 						if (photo[newx][newy][newz] == 1)//1表示这个点有肿瘤
    
 						{
    
 							head++;//满足条件,将这个点作为新的起点,继续查找
    
 							xlist[head] = newx;
    
 							ylist[head] = newy;
    
 							zlist[head] = newz;
    
 							photo[newx][newy][newz] = 2;//2表示这个点已经访问过了
    
 						}
    
 		}
    
 		tail++;//使tail指向当前位置(这个新点)
    
 	}
    
 	return head + 1;//head表示这个数组最后一个元素的下标,+1则为这个数组中元素的个数,也就是肿瘤的个数,也就是肿瘤的体积
    
 }
    
 int main()
    
 {
    
 	cin >> m >> n >> l >> t;
    
 	for (int i = 0; i < l; i++)
    
 	{
    
 		for (int j = 0; j < m; j++)
    
 		{
    
 			for (int k = 0; k < n; k++)
    
 			{
    
 				cin >> photo[j][k][i];
    
 			}
    
 		}
    
 	}
    
 	for (int i = 0; i < l; i++)
    
 	{
    
 		for (int j = 0; j < n; j++)
    
 		{
    
 			for (int k = 0; k < m; k++)
    
 			{
    
 				if (photo[j][k][i] == 1)
    
 				{
    
 					int volumn = seek(j, k, i);
    
 					if (volumn >= t)
    
 						ans += volumn;
    
 				}
    
 			}
    
 		}
    
 	}
    
 	cout << ans << endl;
    
 	return 0;
    
 }

全部评论 (0)

还没有任何评论哟~