1091. Acute Stroke (30)
1.主要是考察并查集
2.每输入一个像素点,就检测它的上边,左边,上一层的位置是否为1,为1的话,归为一个集合
3.最后对集合的数量进行统计
AC代码:
//#include<string>
//#include <iomanip>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
int find(int*r, int x)
{
for (; x != r[x]; x = r[x])
r[x] = r[r[x]];
return r[x];
}
int find(vector<int>&r, int x)
{
for (; x != r[x]; x = r[x])
r[x] = r[r[x]];
return r[x];
}
int main(void)
{
int m,n,l,t;//1286,128,60
cin >> m >> n >> l >> t;
char *image = new char[m*n*l];
memset(image, 0, sizeof(image));
//int *r = new int[m*n*l];
//memset(r, -1, sizeof(r));
vector<int> r(m*n*l, -1);
for (int k = 0; k < l; k++)
{
for (int j = 0; j < m; j++)
{
for (int i = 0; i < n; i++)
{
int tmp = k*(m*n) + j*n + i;
scanf("%d", &image[k*(m*n) + j*n + i]);
if (image[k*(m*n) + j*n + i] == 1)
{
if (r[k*(m*n) + j*n + i] == -1)//如果为-1,则还没初始化代表,进行初始化代表为自己
r[k*(m*n) + j*n + i] = k*(m*n) + j*n + i;
if (i>0 && image[k*(m*n) + j*n + (i - 1)] == 1)
{//上面
r[find(r, k*(m*n) + j*n + i)] = find(r, k*(m*n) + j*n + (i - 1));
}
if (j>0 && image[k*(m*n) + (j-1)*n + i] == 1)
{//左边
r[find(r, k*(m*n) + j*n + i)] = find(r, k*(m*n) + (j - 1)*n + i);
}
if (k>0 && image[(k-1)*(m*n) + j*n + i] == 1)
{//上一层
r[find(r, k*(m*n) + j*n + i)] = find(r, (k - 1)*(m*n) + j*n + i);
}
}
}
}
}
map<int, int> hash;
int sum = 0;
for (int k = 0; k < l; k++)
{
for (int j = 0; j < m; j++)
{
for (int i = 0; i < n; i++)
{
if (image[k*(m*n) + j*n + i] == 1)
{
int tmp = find(r, k*(m*n) + j*n + i);
hash[tmp]++;
if (hash[tmp] == t)
sum += t;
else if (hash[tmp] > t)
sum++;
}
}
}
}
cout << sum << endl;
return 0;
}

浙公网安备 33010602011771号