题目链接:https://www.luogu.com.cn/problem/P7411
分析
DFS。
搜索所有舒适的奶牛,并且让她不舒适,因为有可能加入新的奶牛之后又有新的变成舒适,所以要二次递归,注意记录v数组
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,ans;
int v[3007][3007];
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
int pdcow(int x,int y)
{
int sum=0;
if(!v[x][y]) return 0;
for(int i=1;i<=4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(v[xx][yy]==1) sum++;
}
if(sum==3) return 1;
else return 0;
}
void dfs(int x,int y)
{
for(int i=1;i<=4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(!v[xx][yy])
{
ans++;
v[xx][yy]=1;
if(pdcow(xx,yy)==1) dfs(xx,yy);//如果新的位置又是舒适的
for(int j=1;j<=4;j++)//从新的位置又扩展开
{
if(pdcow(xx+dx[j],yy+dy[j])==1)
{
dfs(xx+dx[j],yy+dy[j]);//二次递归
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x+=1000;y+=1000;//防负数
if(v[x][y])
{
ans--;//如果输入的位置之前被添加过,那之前添加的就没意义
}
v[x][y]=1;
if(pdcow(x,y)) dfs(x,y);
for(int j=1;j<=4;j++)
{
if(pdcow(x+dx[j],y+dy[j]))
{
dfs(x+dx[j],y+dy[j]);
}
}
cout<<ans<<endl;
}
return 0;
}