(BFS)L3-004 肿瘤诊断 (30分)
题目链接:L3-004 肿瘤诊断 (30分)
- 两个像素被认为是“连通的”,如果它们有一个共同的切面 --->从这句话推断出这题是一个三维BFS的题
- 用一个三维数组存放数据,遍历每一个数据,因为这里的数据是0和1就用原数据来记录标记它,计算每一个元素周围的体积(数连通体中1的个数),大于t就累加到体积里面
代码如下:
#include<iostream> #include<queue> using namespace std; const int N = 140, M = 1300,L = 70; struct Node{ int x,y,z; }; int mp[L][M][N]; int dx[6] = {0,1,0,-1,0,0}; int dy[6] = {1,0,-1,0,0,0}; int dz[6] = {0,0,0,0,1,-1}; int n,m,l,t; int ans; void bfs(int i,int j,int k){ queue<Node> q; int sum = 1; mp[i][j][k] = 0; q.push({j,k,i}); while(q.size()){ Node t = q.front(); q.pop(); for(int i = 0; i < 6; i ++ ){ int a = t.x + dx[i]; int b = t.y + dy[i]; int c = t.z + dz[i]; if(a < 0 || a > n-1 || b < 0 || b > m-1 || c < 0 || c > l-1){ continue; } if(!mp[c][a][b]) continue; mp[c][a][b] = 0; sum ++; q.push({a,b,c}); } } if(sum >= t) ans += sum; } int main(){ cin >> n >> m >> l >> t; for(int i = 0; i < l; i ++ ){ for(int j = 0; j < n; j ++ ){ for(int k = 0; k < m; k ++ ){ cin >> mp[i][j][k]; } } } for(int i = 0; i < l; i ++ ){ for(int j = 0; j < n; j ++ ){ for(int k = 0; k < m; k ++ ){ if(mp[i][j][k]) bfs(i,j,k); } } } cout<<ans; return 0; }