1091. Acute Stroke (30)解题报告
2016-12-28 15:41
363 查看
这实际上是并查集问题。题目要求的输出就是不小于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]);
}
}
#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]);
}
}
相关文章推荐
- 1091. Acute Stroke (30) -- DFS(三维空间)
- 1091. Acute Stroke (30)
- [leetcode] 30. Substring with Concatenation of All Words 解题报告
- 1091. Acute Stroke (30) BFS or DFS
- PAT (Advanced Level) 1115. Counting Nodes in a BST (30) 解题报告
- PAT甲题题解-1091. Acute Stroke (30)-BFS
- 1049. Counting Ones (30)解题报告
- 1091. Acute Stroke (30)
- PAT (Advanced Level) 1103. Integer Factorization (30) 解题报告
- 1091. Acute Stroke (30)
- PAT(Advance) 1091. Acute Stroke (30)
- 1091. Acute Stroke (30)
- PAT 1091. Acute Stroke (30)
- PAT 解题报告 1004. Counting Leaves (30)
- 【PAT】1091. Acute Stroke (30)
- PAT 1091. Acute Stroke (30) 3重方向并查集(其实非递归DFS也可以,,)
- 1091. Acute Stroke (30)
- POJ 1091 跳蚤 解题报告(2014携程第一场A题,聪明的猴子)(容斥原理)
- 1091. Acute Stroke (30)
- 1091. Acute Stroke(30)