牛客假日团队赛43:B perimeter

先看题目:https://ac.nowcoder.com/acm/contest/5723/B
题目描述:
有一些草堆块放在一些格子里,每个格子只能放一个草堆块,这些草堆块会形成一个连通块,算连通块的外围周长。
解题思路:
我一开始的思路是,每个初始ans是4*N,也就是每个草堆块四个面的周长都算的情况,然后跟据每个草堆块是向外还是向内可以发现每个草堆块朝向连通块内部的边可以去掉。比如,对于某个草堆块能找到一个草堆块与它y相同,但是x比它大,那么就不必加上这个草堆块的朝右的那个边的长度。但实际上一个简单的反例就可以说明这个思想是错误的。

反例:
图片说明

后来师哥给出了dfs的解法,令我再次感叹自己的弱小。正解来自@The_Flash
怎么想的呢。求最外围的周长,找最外围的点不就完了吗?
绿色是草地
也就是说选择一个点,使得从这个点出发,能围住所有绿色的点,然后计算每个红点的贡献,也就是这个红点与几个绿点相连,这个样直接搜就行了。
总而言之,就是去计算每个红点的贡献,同时要保证红点不要一直拓展下去,即不要离绿点太远。起点选取不唯一,只要在外侧就行。
dfs直接搜索就好,如果遇到了草堆,那么把贡献直接加到答案里。为了保证dfs不会跑到离绿点太远的地方,需要加一个check函数,来搜8个方向上是否会有绿点。check函数之所以要看8个方向是因为,比如这个,如果没有粉色点的话,红色是拓展不过去的
图片说明

代码:

#include<bits/stdc++.h>
using namespace std;
set< pair<int,int> > st;
set< pair<int, int> > vis;
int n;
int ans = 0;
int dx[]={0,0,-1,1,1,1,-1,-1};
int dy[]={1,-1,0,0,1,-1,1,-1};

bool check(int x, int y)
{
    for(int i = 0; i < 8; i++) if(st.count(make_pair(x+dx[i], y+dy[i]))) return 1;
    return 0;
}

void dfs(int x, int y)
{
    if(st.count(make_pair(x, y)) )
    {
        ans++;
        return;
    }
    if(vis.count(make_pair(x, y)) )
    {
        return;
    }
    if(!check(x, y)) return;
    vis.emplace(make_pair(x, y));
    for(int i = 0; i < 4; i++) dfs(x+dx[i], y+dy[i]);
}
int main()
{
    scanf("%d",&n);
    for(int i = 0, x, y ; i < n; i++) scanf("%d %d",&x,&y), st.emplace(make_pair(x, y));
    auto p = *st.begin();
    dfs(p.first-1, p.second);
    printf("%d\n",ans);
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8542次浏览 77人参与
# 你的实习产出是真实的还是包装的? #
1566次浏览 40人参与
# 米连集团26产品管培生项目 #
5469次浏览 213人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7307次浏览 40人参与
# 简历第一个项目做什么 #
31456次浏览 321人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186738次浏览 1118人参与
# 巨人网络春招 #
11282次浏览 223人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152219次浏览 887人参与
# 研究所笔面经互助 #
118829次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433244次浏览 3926人参与
# 简历中的项目经历要怎么写? #
309873次浏览 4177人参与
# 面试紧张时你会有什么表现? #
30461次浏览 188人参与
# 你今年的平均薪资是多少? #
212936次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63209次浏览 791人参与
# 我的求职精神状态 #
447929次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76370次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
363068次浏览 2635人参与
# 你怎么看待AI面试 #
179715次浏览 1222人参与
# 牛客AI文生图 #
21391次浏览 237人参与
# 职能管理面试记录 #
10774次浏览 59人参与
# 网易游戏笔试 #
6438次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160532次浏览 1109人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务