CCF 201912-2回收站选址 (100分)

(1)题目描述

(2)算法思想

  1. 此处给定离散点,由于只需要判断各点之间的联系,因此仅需保存点的坐标而不必构造相应的图,不用考虑内存限制。
  2. 之后考虑各点之间的关系以及得分规则——各点之间的关系分为相邻以及对角线两种,且必须满足有4点相邻才考虑建立回收站并开始计分;对角线关系仅当确定放置回收站后开始作为计分标准,1个对角线垃圾点对应1分。
  3. 按照上述规则开始计分,每次计分对应关系的两点可同时进行加分,减少循环次数。

(3)代码实现

#include
#include
using namespace std;

struct node {
     
	int x;
	int y;
	int grade;
	int tempgrade;
	node() {
     
		x=y=0;
		grade=-4;
		tempgrade=0;
	}
};

inline bool nextto(node pos1, node pos2) {
     
	if(pos1.x==pos2.x && abs(pos1.y-pos2.y)==1)
		return true;
	else if(pos1.y==pos2.y && abs(pos1.x-pos2.x)==1)
		return true;
	return false;
}

inline bool diagonal(node pos1, node pos2) {
     
	if(abs(pos1.x-pos2.x)==1 && abs(pos1.y-pos2.y)==1)
		return true;
	return false;
}

int main() {
     
	int n;
	cin>>n;
	int a[5]= {
     0};
	node pos[n];
	for(int i=0; i<n; i++)
		cin>>pos[i].x>>pos[i].y;
	for(int i=0; i<n-1; i++) {
     
		for(int j=i+1; j<n; j++) {
     
			if(nextto(pos[i],pos[j])) {
     
				pos[i].grade++;
				pos[j].grade++;
			}
			if(diagonal(pos[i],pos[j])) {
     
				pos[i].tempgrade++;
				pos[j].tempgrade++;
			}
		}
		if(pos[i].grade==0) {
     
			pos[i].grade+=pos[i].tempgrade;
		}
	}
	for(int i=0; i<n; i++) {
     
		if(pos[i].grade>=0)
			a[pos[i].grade]++;
	}
	for(int i=0; i<5; i++)
		cout<<a[i]<<endl;
	return 0;
}

你可能感兴趣的:(CCF,算法,数据结构)