这题挺有意思
思路, 先将所有城市的领地都加到一个集合里,然后再拿出一个点判断其周围点是否在集合中,不在就加入队列,再判断这些点是否满足2*2的特性,满足就将其放入队列,就这样循环判断到队列为空为止,思路出来代码就很好写了
#include<bits/stdc++.h>
#define MEM(a,x) memset(a,x,sizeof(a));
#define MEMINF(a) memset(a,0x3f,sizeof(a));
#define MP make_pair
using namespace std;
typedef long long LL;
const int MAXN=205;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
typedef pair<int,int> nod;
set<nod >s;
int dx[8]={-1,1,-1,0,0,1,-1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
void Addnode(int x,int y,int c) {
int lim=c+2;
for (int i=-c-1; i<=c+1; ++i)
for (int j=-c-1; j<=c+1; ++j)
if (abs(i)+abs(j)<=lim)
s.insert(MP(x+i,y+j));
}
int main() {
int n;
int x,y,c;
freopen("control.in","r",stdin);
freopen("control.out","w",stdout);
while (cin>>n) {
if (!n)break;
s.clear();
queue<nod>q;
for (int i=0; i<n; ++i) {
scanf("%d %d %d",&x,&y,&c);
Addnode(x,y,c);
}
int ux,uy,vx,vy;
for (set<nod >::iterator i=s.begin(); i!=s.end(); ++i) {
ux=i->first;
uy=i->second;
for (int cnt=0; cnt<8; ++cnt) {
vx=ux+dx[cnt];
vy=uy+dy[cnt];
nod nex=MP(vx,vy);
if (s.count(nex)==0) q.push(nex);
}
}
while (!q.empty()) {
nod no=q.front();
q.pop();
int ux=no.first;
int uy=no.second;
if(((s.count(MP(ux-1,uy-1))==0)&&(s.count(MP(ux,uy-1))==0)&&(s.count(MP(ux-1,uy))==0)))continue;
if(((s.count(MP(ux,uy-1))==0)&&(s.count(MP(ux+1,uy-1))==0)&&(s.count(MP(ux+1,uy))==0)))continue;
if(((s.count(MP(ux-1,uy))==0)&&(s.count(MP(ux-1,uy+1))==0)&&(s.count(MP(ux,uy+1))==0)))continue;
if(((s.count(MP(ux+1,uy))==0)&&(s.count(MP(ux+1,uy+1))==0)&&(s.count(MP(ux,uy+1))==0)))continue;
s.insert(no);
for (int i=0; i<8; ++i) {
vx=ux+dx[i];
vy=uy+dy[i];
nod nex=MP(ux,uy);
if (s.count(nex)==0) q.push(nex);
}
//}
}
printf("%d\n",(int)s.size());
}
}