L3-004 腫瘤診斷 (30)(精簡40行 思路)

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<vector>
using namespace std;
vector<vector<vector<int>>> photo;
vector<vector<int>> dir = { {1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1} };
int M, N, L, T;
int getArea(int k, int x, int y) {
	if (k<0||k>=L||			//邊界檢測
		x<0||x>=M||
		y<0||y>=N||
		photo[k][x][y] == 0 )//腫瘤查找
		return 0;
	photo[k][x][y] = 0;		 //訪問過就消除
	int result = 1;			 //累加統計
	for (int i = 0; i < dir.size(); i++) 
		result += getArea(k + dir[i][0], x + dir[i][1], y + dir[i][2]);	
	return result;
}
int main() {
	cin >> M >> N >> L >> T;
	photo.resize(L);
	for (int k = 0; k < L; k++) {
		photo[k].resize(M);
		for (int i = 0; i < M; i++) {
			photo[k][i].resize(N);
			for (int j = 0; j < N; j++) {
				cin >> photo[k][i][j];
			}
		}
	}
	int result = 0;
	for (int k = 0; k < L; k++) {
		for (int i = 0; i < M; i++) {
			for (int j = 0; j < N; j++) {
				int area = getArea(k, i, j);
				if (area >= T)
					result += area;
			}
		}
	}
	cout << result;
	return 0;
}

 

發佈了374 篇原創文章 · 獲贊 147 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章