L3-004 腫瘤診斷

題目鏈接

L3-004 腫瘤診斷 (30 分)

在診斷腫瘤疾病時,計算腫瘤體積是很重要的一環。給定病竈掃描切片中標註出的疑似腫瘤區域,請你計算腫瘤的體積。

輸入格式:

輸入第一行給出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個紅色的像素都與藍色的像素連通。

輸出格式:

在一行中輸出腫瘤的總體積。

輸入樣例:

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

思路:剛開用的dfs發生了兩個段錯誤,不知道爲爲什麼,看別人博客說是遞歸太多結果炸了。

代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long int ll;
ll n,m,l,t,s=0,st=0;//行 列 層數 大於等於t 
int dp[65][1300][130]={0};
int f[6][3]={{0,0,-1},{0,-1,0},{0,1,0},{0,0,1},{1,0,0},{-1,0,0}};//層 行 列 
void dfs(int z,int x,int y)
{
	dp[z][x][y]=0;
	for(int i=0;i<6;i++){
		int fz=f[i][0]+z;
		int fx=f[i][1]+x;
		int fy=f[i][2]+y;
		if(fz>=1&&fz<=l&&fx>=1&&fx<=n&&fy>=1&&fy<=m&&dp[fz][fx][fy]){// 1爲腫瘤
		    st++;
			dfs(fz,fx,fy);
		}
	}
} 
int main()
{
	cin>>n>>m>>l>>t;
	for(int i=1;i<=l;i++){//層數 
		for(int j=1;j<=n;j++){//行數 
			for(int k=1;k<=m;k++){//列數 
				cin>>dp[i][j][k]; // 1爲腫瘤 
			}
		}
	}
	for(int i=1;i<=l;i++){//層數 
		for(int j=1;j<=n;j++){//行數 
			for(int k=1;k<=m;k++){//列數 
			    if(dp[i][j][k]){
			        st=1;
			        dfs(i,j,k);	
				    if(st>=t){
					    s+=st;
				    }							    	
				}
			}
		}
	}
	cout<<s<<endl;
}

bfsAC代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long int ll;
int n,m,l,t;//行 列 層數 大於等於t
ll st=0,s=0;
int dp[65][1300][130]={0};
int f[6][3]={{0,0,-1},{0,-1,0},{0,1,0},{0,0,1},{1,0,0},{-1,0,0}};//層 行 列
struct node{
	int x,y,z;
}p,q;
queue<node>my;
bool check(int fz,int fx,int fy)
{
	if(fz>=1&&fz<=l&&fx>=1&&fx<=n&&fy>=1&&fy<=m&&dp[fz][fx][fy]){// 1爲腫瘤
	    dp[fz][fx][fy]=0;
		return true;
	}
	return false;
} 
void bfs(int z,int x,int y)
{
	//st=1;
	dp[z][x][y]=0;
	while(!my.empty()) my.pop();
	p.z=z,p.x=x,p.y=y;
	my.push(p);
	while(!my.empty()){
		p=my.front();my.pop();
	    for(int i=0;i<6;i++){
		    q.z=f[i][0]+p.z;
		    q.x=f[i][1]+p.x;
		    q.y=f[i][2]+p.y;
		    if(check(q.z,q.x,q.y)){
		    	my.push(q);
		    	st++;
			}
	    }		
	}
	//s+=st;
} 
int main()
{
	cin>>n>>m>>l>>t;
	for(int i=1;i<=l;i++){//層數 
		for(int j=1;j<=n;j++){//行數 
			for(int k=1;k<=m;k++){//列數 
				scanf("%d",&dp[i][j][k]); // 1爲腫瘤 
			}
		}
	}
	for(int i=1;i<=l;i++){//層數 
		for(int j=1;j<=n;j++){//行數 
			for(int k=1;k<=m;k++){//列數 
			    if(dp[i][j][k]){// 1爲腫瘤
			        st=1;
			    	bfs(i,j,k);
			    	if(st>=t){
			    		s+=st;
					}
				}
			}
		}
	}
	cout<<s<<endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章