显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int change(int x)
{
return x+1000;
}
int mp[3100][3100],n,a,b,cnt=0;
struct PE
{
int x,y;
};
PE sd;
queue<PE> q;
int main()
{
freopen("comfort.in","r",stdin);
freopen("comfort.out","w",stdout);
memset(mp,0,sizeof(mp));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a>>b;
a=change(a);
b=change(b);
if(mp[a][b]==2)
{
cnt--;
mp[a][b]=1;
cout<<cnt<<endl;
continue;
}
mp[a][b]=1;
sd.x=a;
sd.y=b;
q.push(sd);
if(mp[a-1][b]!=0)
{
sd.x=a-1;
sd.y=b;
q.push(sd);
}
if(mp[a+1][b]!=0)
{
sd.x=a+1;
sd.y=b;
q.push(sd);
}
if(mp[a][b-1]!=0)
{
sd.x=a;
sd.y=b-1;
q.push(sd);
}
if(mp[a][b+1]!=0)
{
sd.x=a;
sd.y=b+1;
q.push(sd);
}
while(!q.empty())
{
int et=0,tx,ty,ex,ey;
tx=q.front().x;
ty=q.front().y;
q.pop();
if(mp[tx][ty-1]==0)
{
et++;
ex=tx;
ey=ty-1;
}
if(mp[tx][ty+1]==0)
{
et++;
ex=tx;
ey=ty+1;
}
if(mp[tx-1][ty]==0)
{
et++;
ex=tx-1;
ey=ty;
}
if(mp[tx+1][ty]==0)
{
et++;
ex=tx+1;
ey=ty;
}
//cout<<tx<<' '<<ty<<' '<<et<<endl;
if(et==1)
{
cnt++;
mp[ex][ey]=2;
sd.x=ex;
sd.y=ey;
q.push(sd);
if(mp[ex-1][ey]!=0)
{
sd.x=ex-1;
sd.y=ey;
q.push(sd);
}
if(mp[ex+1][ey]!=0)
{
sd.x=ex+1;
sd.y=ey;
q.push(sd);
}
if(mp[ex][ey-1]!=0)
{
sd.x=ex;
sd.y=ey-1;
q.push(sd);
}
if(mp[ex][ey+1]!=0)
{
sd.x=ex;
sd.y=ey+1;
q.push(sd);
}
//cout<<"s";
}
}
cout<<cnt<<endl;
}
return 0;
}