題目鏈接
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;
}