#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <vector>
#include <stack>
#include <sstream>
#include <list>
#include <queue>
using namespace std;
class union_find {
vector<int> data;
int __size;
public:
vector<int> spot;
vector<int> memb;
union_find(int n) :__size(n) {
data.resize(n);
spot.resize(n);
memb.resize(n);
for (int i = 0; i < n; i++) data[i] = i;
}
int find(int which) {
while (which != data[which]) {
which = data[which];
}
return which;
}
void merge(int ua, int ub) {
ua = find(ua), ub = find(ub);
if (ua < ub) {
spot[ua] += spot[ub];
memb[ua] += memb[ub];
data[ub] = ua;
__size--;
}
else if (ua > ub) {
spot[ub] += spot[ua];
memb[ub] += memb[ua];
data[ua] = ub;
__size--;
}
}
inline int size() { return __size; }
void memb_add(int which) {
which = find(which);
memb[which]++;
}
void spot_add(int which) {
which = find(which);
spot[which]++;
}
};
void achieve(vector<vector<int>> mp) {
int n = mp.size(), m = mp[0].size();
union_find unf(n * m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (mp[i][j] == 1)continue;
if (mp[i][j] == 2) unf.memb_add(i * m + j);
if (mp[i][j] == 3) unf.spot_add(i * m + j);
if (i > 0 && mp[i - 1][j] != 1) {
unf.merge((i - 1) * m + j, i * m + j);
}
if (j > 0 && mp[i][j - 1] != 1) {
unf.merge(i * m + j - 1, i * m + j);
}
}
}
for (int i = 0; i < unf.size(); i++) {
if (unf.memb[i] == 2) {
cout << unf.spot[i];
return;
}
}
cout << -1;
}
int main() {
achieve({
{2,1,0,3},
{0,1,2,1},
{0,3,0,1},
{0,1,1,3} });
}
欢乐的周末
于 2024-03-20 21:00:27 首次发布