[PAT] A1091 Acute Stroke

tech2022-09-06  99

题目大意

给定一个三维空间,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; }
最新回复(0)