[PAT] A1091 Acute Stroke
题目大意
给定一个三维空间,0表示正常1表示有肿瘤,肿瘤块的大小大于等于t才算作是肿瘤。计算所有满足肿瘤块的大小之和。
题目链接
思路
用三维数组存储。BFS广度优先搜索。注意细节。
AC代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct node {
int ii, jj, kk;
};
int G[61][1300][130];
int index[6][3] = { {0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0} };
bool vis[61][1300][130] = { false };
int M, N, L, T, volume = 0;
int BFS(node s) {
int ans = 1;
queue<node>q;
q.push(s);
vis[s.ii][s.jj][s.kk] = true;//注意只要push就标记vis!!!
while (!q.empty()) {
node t = q.front();
for (int i = 0; i < 6; i++) {
int z = t.ii + index[i][0], x = t.jj + index[i][1], y = t.kk + index[i][2];
if (z < 0 || z >= L || x < 0 || x >= M || y < 0 || y >= N);//注意边界判断!!!
else if (vis[z][x][y]==false && G[z][x][y]) {
ans++;
q.push({ z,x,y });
vis[z][x][y] = true;
}
}
q.pop();
}
return ans;
}
void Trave() {
int i, j, k;
for (i = 0; i < L; i++)
for (j = 0; j < M; j++)
for (k = 0; k < N; k++) {
if (vis[i][j][k] == false && G[i][j][k] == 1) {
int tv = BFS({ i,j,k });
if (tv >= T)volume += tv;
}
}
}
int main() {
int i, j, k;
scanf("%d%d%d%d", &M, &N, &L, &T);
for (i = 0; i < L; i++)
for (j = 0; j < M; j++)
for (k = 0; k < N; k++)
scanf("%d", &G[i][j][k]);
Trave();
printf("%d", volume);
return 0;
}