[USACO13FEB]Perimeter【DFS / 深搜】

Pro

Luogu3072

Sol

这题的话,我就把我的想做当做反例给说一下。

错误想法:很容易的发现,一个不规则的图形,我们可以通过转换为规则的矩形来求周长,可以平移一些边来求得,但是存在反例。

如图,蓝色为草堆。如果我们按照边平移转换为规则的矩形求得话,答案就是 16 ,但我们会发现,那块空白的区域的两条边没有算进去,所以正确答案应该是 18

正解:既然只有一个联通块,那么我们就可以搜索,直接深搜,唯一需要注意的点就是中间的空白部分,用 j u d 函数判断。

Code

#include<iostream>
#include<cstdio>
#include<set>
using namespace std;

set< pair < int,int > >s , vis;
int n , ans;

int jud(int x , int y) {
    for(int i=-1;i<=1;i++)
        for(int j=-1;j<=1;j++)   
            if(s.count(make_pair(x+i,y+j))==1)
                return 0;
    return 1;
}

void dfs(int x , int y) {
    if(s.count(make_pair(x,y))) {
        ans++;
        return ;
    }
    if(vis.count(make_pair(x,y)))
        return ;
    vis.insert(make_pair(x,y));
    if(jud(x,y))
        return ;
    dfs(x+1 , y);
    dfs(x-1 , y);
    dfs(x , y+1);
    dfs(x , y-1);
}

int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        s.insert(make_pair(x,y));
    }
    pair<int,int>st = *s.begin();
    dfs(st.first-1 , st.second-1);
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43061009/article/details/82108427