Pro
Sol
这题的话,我就把我的想做当做反例给说一下。
错误想法:很容易的发现,一个不规则的图形,我们可以通过转换为规则的矩形来求周长,可以平移一些边来求得,但是存在反例。
如图,蓝色为草堆。如果我们按照边平移转换为规则的矩形求得话,答案就是 ,但我们会发现,那块空白的区域的两条边没有算进去,所以正确答案应该是 。
正解:既然只有一个联通块,那么我们就可以搜索,直接深搜,唯一需要注意的点就是中间的空白部分,用 函数判断。
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;
}