时间:1s 空间:256M
题目描述:
有一个无限大的蜂窝,里面住着一些蜜蜂,如图。
蜜蜂的家是由若干个蜂窝里的六边形连接而成,一个六边形(i,j),与六边形(i−1,j−1),(i−1,j),(i,j−1),(i,j+1),(i+1,j),(i+1,j+1)相邻。
现在小信知道一些六边形上有蜜蜂,请你告诉小信共有多少个蜜蜂的家。
输入格式:
第一行包含一个整数 n,代表有蜜蜂的六边形个数。
接下来 n 行,每行两个整数 xi,yi,表示有蜜蜂的六边形坐标。保证不存在相同的坐标。
输出格式:
输出一个整数表示答案。
样例输入:
7
0 0
1 1
1 0
1 -1
0 2
3 2
3 1
样例输出:
3
约定:
对于100%的数据,1≤n≤1000,0≤|xi|,|yi|≤1000,保证坐标互不相同。
题意:
根据图来解释,比如0,1和1,1连在一起,如果里面都有蜜蜂,则算一个家,如果一个六边形内是蜜蜂,六方没有其他蜜蜂,就算一个家,有则和别的蜜蜂合起来算一个家。
样例解释:0,0 1,1 1,0 1,-1四个连在一起是一个家,0,2单独一家,3,2和3,1连一起算一家。
思路: 我们先将有蜜蜂的坐标化为二维数组中0和1,有蜜蜂的位置为1,无蜜蜂的位置为0。
这道题六联通嘛,所以先开两个数组代表六个方向,数组要开7,就代表(x−1,y−1),(x−1,y),(x,y−1),(x,y+1),(x+1,y),(x+1,y+1)这几个方向,所以数组这么开:
int fx[7]={-1,-1,0,0,1,1}
int fy[7]={-1,0,-1,1,0,1}
用map(mp)数组代表蜜蜂坐标。
同时有蜜蜂的就让这个坐标代表的数=1,没有蜜蜂就0,因为有的坐标是负数,所以坐标加上1009。
接下来就是搜索函数用fx,fy,找到有蜜蜂的六边形,sum++,同时向六方搜索,搜到同样有蜜蜂的把它变0,因为连着的属于一家,这样就不会重复。
最后输出sum即可。
代码:
#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;
}