题目描述:
有一个无限大的蜂窝,里面住着一些蜜蜂,如图。
蜜蜂的家是由若干个蜂窝里的六边形连接而成,一个六边形(i,j),与六边形(i−1,j−1),(i−1,j),(i,j−1),(i,j+1),(i+1,j),(i+1,j+1)相邻。
现在小信知道一些六边形上有蜜蜂,请你告诉小信共有多少个蜜蜂的家。
根据题意可得本题为六连通问题。且因为坐标存在负数,在录入时需加上1009。
下附代码
#include<bits/stdc++.h>
using namespace std;
bool mp[2077][2077];
int fx[7] = {-1,-1,0,0,1,1};
int fy[7] = {-1,0,-1,1,0,1};
void dfs(int x,int y){
for (int i = 0; i <= 5;i++){
if(mp[x+fx[i]][y+fy[i]]==1){
mp[x + fx[i]][y + fy[i]] = 0;
dfs(x + fx[i], y + fy[i]);
}
}
}
int main(){
int n,mx=0,my=0;
cin >> n;
for (int i = 1; i <= n;i++){
int a, b;
cin >> a >> b;
mp[a+1009][b+1009] = 1;
mx = max(mx, a+1009);
my = max(my, b+1009);
}
long long sum = 0;
for (int i = 1; i <= mx;i++){
for (int j = 1; j <= my;j++){
if(mp[i][j]==1){
sum++;
mp[i][j] = 0;
dfs(i, j);
}
}
}
cout << sum;
}