标题CCF认证201912-2 回收站选址(100分)
这几天课程比较多只能随缘写题了。第二题也不难,构造一个结构体存放坐标以及上下左右、四个对角的垃圾站个数;使用vector容器适用不同的输入样例;输出用一维数组按序输出正好与输出每行代表的得分相同。
AC代码如下:
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
struct point{
int x; //x,y为垃圾站坐标
int y;
int z; //上下左右有垃圾站的个数
int w; //评分,即四个对角有垃圾站的个数
point(int a,int b):x(a),y(b),z(0),w(0){ } //坐标初始化
};
int main()
{
vector <point> p;
int n,x,y;
cin>>n;
int a[5];
memset(a,0,5*sizeof(int)); //评分数组置0
//输入并赋值坐标
for(int i=0;i<n;i++)
{
cin>>x>>y;
p.push_back(point(x,y));
}
//检查上下左右及四个对角有垃圾站的个数
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if( (p[i].x+1)==p[j].x && p[i].y==p[j].y) p[i].z++;
else if( (p[i].x-1)==p[j].x && p[i].y==p[j].y) p[i].z++;
else if( p[i].x==p[j].x && (p[i].y+1)==p[j].y) p[i].z++;
else if(p[i].x==p[j].x && (p[i].y-1)==p[j].y) p[i].z++;
else if( (p[i].x+1)==p[j].x && (p[i].y+1)==p[j].y) p[i].w++;
else if( (p[i].x-1)==p[j].x && (p[i].y-1)==p[j].y) p[i].w++;
else if( (p[i].x+1)==p[j].x && (p[i].y-1)==p[j].y) p[i].w++;
else if( (p[i].x-1)==p[j].x && (p[i].y+1)==p[j].y) p[i].w++;
}
//上下左右全有垃圾站的坐标,对应评分数组+1
if(p[i].z==4) a[p[i].w]++;
}
//输出评分数组
for(int i=0;i<5;i++)
cout<<a[i]<<'\n';
return 0;
}
/*
样例输入
7
1 2
2 1
0 0
1 1
1 0
2 0
0 1
输出
0
0
1
0
0
*/