CCF-CSP回收站选址暴力法
输入n个垃圾点坐标。要求输出每一个不同评分回收站的个数,若某一个垃圾点上下左右都有其他垃圾点,即可作为回收站,若四个对角每多一个垃圾点,评分加一。遍历两次,一次进行回收站的判定,一次进行评分的统计,最后输出评分即可
1
//个人觉得结构体是很重要的,可以用来标记很多状态,比数组好理解一些。第二题常见无超时限制时套路为两个for循环,一个判断语句即可解决
#include<iostream>
using namespace std;
struct S
{
int x;
int y;
int flag=0;//回收站为1,不是回收站默认为0
int score=0;//上下左右是否有其他垃圾点
int up=0;
int down=0;
int left=0;
int right=0;
};
int main()
{
int count[5]={0,0,0,0,0};
int n;
int x,y;
cin>>n;
S s[n];
for(int i=0;i<n;i++)
{
cin>>x>>y;
s[i].x=x;
s[i].y=y;
}
for(int i=0;i<n;i++)//遍历第一次,看是否有资格成为回收站
{
for(int j=0;j<n;j++)
{
if(s[i].x-1==s[j].x&&s[i].y==s[j].y)
{
s[i].left=1;
}
else if(s[i].x+1==s[j].x&&s[i].y==s[j].y)
{
s[i].right=1;
}
else if(s[i].x==s[j].x&&s[i].y+1==s[j].y)
{
s[i].up=1;
}
else if (s[i].x==s[j].x&&s[i].y-1==s[j].y)
{
s[i].down=1;
}
}
}
for(int i=0;i<n;i++)
{
if(s[i].down*s[i].left*s[i].right*s[i].up)
{
s[i].flag=1;
}
}
for(int i=0;i<n;i++)
{
if(s[i].flag)//遍历第二次,统计对角线上的垃圾点进行评分
{
for(int j=0;j<n;j++)
{
if(s[i].x-1==s[j].x&&s[i].y-1==s[j].y)
{
s[i].score++;
}
else if(s[i].x+1==s[j].x&&s[i].y+1==s[j].y)
{
s[i].score++;
}
else if(s[i].x+1==s[j].x&&s[i].y-1==s[j].y)
{
s[i].score++;
}
else if(s[i].x-1==s[j].x&&s[i].y+1==s[j].y)
{
s[i].score++;
}
}
}
}
for(int i=0;i<n;i++)
{
if(s[i].flag)
{
switch(s[i].score)
{
case 0:count[0]++;break;
case 1:count[1]++;break;
case 2:count[2]++;break;
case 3:count[3]++;break;
case 4:count[4]++;break;
}
}
}
for(int i=0;i<5;i++)
cout<<count[i]<<endl;
}