1月3号 B题 蜜蜂的家

该问题描述了一个无限大的六边形蜂窝网络,其中包含一些有蜜蜂的六边形。给定有蜜蜂的六边形坐标,任务是计算有多少个独立的蜜蜂家庭,即相连的有蜜蜂的六边形视为一家。解决方案涉及使用深度优先搜索(DFS)遍历相邻的六边形,标记已访问过的并避免重复计数。最终输出是独立家庭的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值