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;
}