[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;
}
posted @ 2020-09-01 17:01  \0.0/  阅读(90)  评论(0编辑  收藏  举报