题目链接https://www.acwing.com/problem/content/3374/
分析 :
新加入的一头奶牛A,则我们每次只需要判断与A相邻的4头牛和A这头牛
舒适的牛数量增加的情况:五头牛中的任意一头牛与其相邻的牛的数量为3
舒适的牛数量减少的情况:除奶牛A外,其他任一奶牛与其相邻的牛数量为4
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1100;
bool pos[N][N]; //每头奶牛的位置
int n; //奶牛的数量
int dx[6]={0,-1,0,1,0};
int dy[6]={0,0,1,0,-1}; //四周奶牛的偏移量
//思路:新加入的奶牛只会影响它周围的四头奶牛
int isCom(int x,int y)
{
int cnt=0; //与该奶牛相邻的奶牛数量
for(int i=1;i<5;i++)
{
int ux=x+dx[i],uy=y+dy[i];
if(ux<0||uy<0||ux>1000||uy>1000) continue;
cnt+=pos[ux][uy];
}
return cnt;
}
int main()
{
cin>>n;
int res=0; //奶牛舒适的数量
while(n--)
{
int x,y;
cin>>x>>y;
pos[x][y]=true;
//每次加入我们就看这个牛对其他牛的影响
for(int i=0;i<5;i++)
{
int ux=x+dx[i],uy=y+dy[i];
//假如没有我们要找的位置
if(ux<0||uy<0||ux>1000||uy>1000||!pos[ux][uy])
continue;
//假如我们发现了一头新的舒适奶牛
if(isCom(ux,uy)==3)
res++;
//假如我们减少了一头舒适的奶牛,不能是新加的这个奶牛
//因为这头奶牛就不曾舒适过
if(i!=0 && isCom(ux,uy)==4)
res--;
}
cout<<res<<endl;
}
return 0;
}