Andrew Stankevich Contest 6 B Under Control

这题挺有意思

思路, 先将所有城市的领地都加到一个集合里,然后再拿出一个点判断其周围点是否在集合中,不在就加入队列,再判断这些点是否满足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());
  }
}

    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值