CCF题号
2019-12-02
题目
思路:构造一个结构体,每一个点都是一个结点,这个结点存储了该点的横纵坐标和八个方位上是否有其他点的存在,据此,将所有点都进行编排,然后筛选得到符合要求的垃圾集中点
源码
#include<iostream>
#include<string>
using namespace std;
typedef struct spot
{
long x;
long y;
bool up;//上邻居是否存在,默认不存在flase,以下同理
bool down;
bool left;
bool right;
bool leftup;//左上邻居
bool leftdown;
bool rightup;
bool rightdown;
}spot;
int main()
{
//作为垃圾集中点的前提是上下左右都有垃圾,其次,判断得分多少的是四个对角位置的垃圾的个数
int n;
scanf("%d",&n);
spot field[n];
for(int i=0;i<n;++i)
{
scanf("%ld %ld",&field[i].x,&field[i].y);
field[i].up=false;
field[i].down=false;
field[i].left=false;
field[i].right=false;
field[i].leftup=false;
field[i].leftdown=false;
field[i].rightup=false;
field[i].rightdown=false;
}
for(int i=0;i<n;++i)//给每一个垃圾点做位置信息的编辑
{
for(int j=i+1;j<n;++j)
{
if(field[j].x==field[i].x && field[j].y==field[i].y+1)//i上邻居存在,则j下邻居存在,以下其他情况同理
{
field[i].up=true;
field[j].down=true;
}
else if(field[j].x==field[i].x && field[j].y==field[i].y-1)//下邻居
{
field[i].down=true;
field[j].up=true;
}
else if(field[j].y==field[i].y && field[i].x-1==field[j].x)//左邻居
{
field[i].left=true;
field[j].right=true;
}
else if(field[j].y==field[i].y && field[i].x+1==field[j].x)//右邻居
{
field[i].right=true;
field[j].left=true;
}
else if(field[i].x-1==field[j].x && field[i].y+1==field[j].y)//左上邻居
{
field[i].leftup=true;
field[j].rightdown=true;
}
else if(field[i].x-1==field[j].x && field[j].y==field[i].y-1)//左下邻居
{
field[i].leftdown=true;
field[j].rightup=true;
}
else if(field[i].x+1==field[j].x && field[i].y+1==field[j].y)//右上邻居
{
field[i].rightup=true;
field[j].leftdown=true;
}
else if(field[i].x+1==field[j].x && field[i].y-1==field[j].y)//右下邻居;切记此处不可以用else,因为还有可能j点根本不是i点的邻居
{
field[i].rightdown=true;
field[j].leftup=true;
}
}
}
//测试代码,可忽略
// printf("u d l r lu ld ru rd\n");
// for(int i=0;i<n;++i)
// {
// printf("%d %d %d %d %d %d %d %d\n",field[i].up,field[i].down,field[i].left,field[i].right,field[i].leftup,field[i].leftdown,field[i].rightup,field[i].rightdown);
// }
//下面开始对这些垃圾点进行排除,首先记录得每种分数的个数zero,one,two,three,four
int zero,one,two,three,four,score;
zero=one=two=three=four=0;
for(int i=0;i<n;++i)
{
//首先需要具有集中点的资格
if(field[i].down==true && field[i].left==true && field[i].right==true && field[i].up==true)
{
score=0;
if(field[i].leftup==true)
{
++score;
}
if(field[i].leftdown==true)
{
++score;
}
if(field[i].rightup==true)
{
++score;
}
if(field[i].rightdown==true)
{
++score;
}
if(score==0)
{
++zero;
}
else if(score==1)
{
++one;
}
else if(score==2)
{
++two;
}
else if(score==3)
{
++three;
}
else if(score==4)
{
++four;
}
}
}
printf("%d\n",zero);
printf("%d\n",one);
printf("%d\n",two);
printf("%d\n",three);
printf("%d\n",four);
return 0;
}
得分