1091. Acute Stroke (30)解题报告

本文介绍了一种在三维空间中使用并查集算法解决特定问题的方法。通过三维矩阵表示空间,并利用并查集进行元素合并及计数,解决了求不小于指定大小的集合内元素数量的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这实际上是并查集问题。题目要求的输出就是不小于T大小的集合里面含有的所有元素的数量。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

void setunion(int s[], int i, int j);
int findroot(int s[], int i);

int main(int argc, char** argv) {
	int *s, m, n, l, t, i, j, k, tmp, index, cnt;
	bool *matrix;
	scanf("%d %d %d %d", &m, &n, &l, &t);
	s = new int[m * n * l];
	matrix = new bool[m * n * l];

	for(i = 0; i < l; i++){
		for(j = 0; j < m; j++){
			for(k = 0; k < n; k++){
				s[i * m * n + j * n + k] = -1;
			}
		}
	}
	
	for(i = 0; i < l; i++){
		for(j = 0; j < m; j++){
			for(k = 0; k < n; k++){
				scanf("%d", &tmp);
				if(tmp){
					matrix[i * m * n + j * n + k] = true;
				}
				else{
					matrix[i * m * n + j * n + k] = false;
				}
			}
		}
	}
	
	for(i = 0; i < l; i++){
		for(j = 0; j < m; j++){
			for(k = 0; k < n; k++){
				index = i * m * n + j * n + k;
				if(matrix[index]){
					if(i - 1 >= 0 && matrix[(i - 1) * m * n + j * n + k]){
						setunion(s, index, (i - 1) * m * n + j * n + k);
					}
					if(j - 1 >= 0 && matrix[i * m * n + (j - 1) * n + k]){
						setunion(s, index, i * m * n + (j - 1) * n + k);
					}
					if(k - 1 >= 0 && matrix[i * m * n + j * n + k - 1]){
						setunion(s, index, i * m * n + j * n + k - 1);
					}
				}
			}
		}
	}
	cnt = 0;
	for(i = 0; i < l; i++){
		for(j = 0; j < m; j++){
			for(k = 0; k < n; k++){
				index = i * m * n + j * n + k;
				if(matrix[index] && s[index] < 0 && -s[index] >= t){
					cnt += (-s[index]);
				}	
			}
		}

	}
	
	printf("%d", cnt);
	
	delete[] s;
	delete[] matrix;
	return 0;
}

void setunion(int s[], int i, int j){
	int root1, root2;
	root1 = findroot(s, i);
	root2 = findroot(s, j);
	if(root1 == root2){
		return;
	}
	if(s[root1] < s[root2]){
		s[root1] += s[root2];
		s[root2] = root1;
	}
	else{
		s[root2] += s[root1];
		s[root1] = root2;
	}
	return;
}
int findroot(int s[], int i){
	if(s[i] < 0){
		return i;
	}
	else{
		return s[i] = findroot(s, s[i]);
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值