CCF201912-2 回收站选址


问题描述

试题编号: 201912-2
试题名称: 回收站选址
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

 

代码:本题不难,通过题的描述可以发现,关键在于:如何存储点(stl),如何直接由点判断此处是否有垃圾 (map)

坐标值范围比较大,而且坐标有可能是负数,难以用矩阵来存储坐标点,所以使用稀疏矩阵来存储。用STL的map来存储坐标是最为简单的。

如何存储点,可以用三种方法:

1、pair,而且临时创建一个pair也很方便

CCF201912-2 回收站选址_第1张图片

2、自定义结构体

3、vector也能用

//方法1.pair
#include
using namespace std;
//CCF 201912-2 pair
const int maxn=1010;
pair p[maxn];
map,int> mp;
int d[5];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i

 

//方法2:结构体
#include
using namespace std;
const int maxn=1010;
//map会以key做排序,明显不知道怎么排序了.
struct Node{
	int x,y;
	bool operator < (const Node a) const {  
        if(x!=a.x) return x < a.x;      //从小到大排序
        else return y mp;
int change[5][2]={
    {0,1},{1,0},{-1,0},{0,-1}};
int score[5][2]={
    {-1,-1},{1,1},{-1,1},{1,-1}};
int d[5]={0};
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i
//方法3 vector
#include
using namespace std;
//const int maxn=1010;
vector temp2;
map,int> mp;
int change[9][2]={
    {0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};
int keping(int x,int y){
	for(int i=0;i<4;i++){
		temp2.clear();
		temp2.push_back(x+change[i][0]);
		temp2.push_back(y+change[i][1]);
		if(mp.find(temp2)==mp.end()) return -1;
	}
	int num=0;
	for(int i=4;i<8;i++){
		temp2.clear();
		temp2.push_back(x+change[i][0]);
		temp2.push_back(y+change[i][1]);
		if(mp.find(temp2)!=mp.end()&&mp[temp2]==1) num++;
	}
	return num;
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i temp(2);
		scanf("%d %d",&temp[0],&temp[1]);
		mp[temp]=1;
	}
	int d[5]={0};
	for(auto x=mp.begin();x!=mp.end();x++){ 
		vector temp=x->first;
		int num=keping(temp[0],temp[1]);
		if(num<0) continue;
		d[num]++;
	}
	printf("%d\n%d\n%d\n%d\n%d\n",d[0],d[1],d[2],d[3],d[4]);
	return 0;
}

使用结构体要重载运算符,以便map排序,出错信息:

 [Error] no match for 'operator<' (operand types are 'const Node' and 'const Node')

当然这样之后Node(x,y)就直接生成一个临时变量了。

struct Node {  
        int d, e;  
       bool operator < (const Node x) const {  
            return d < x.d;      //从小到大排序
        }   
        Node(int d, int e):d(d), e(e){}  
    }; 

以上信息与pair p;等同。 

 

 

 

 

你可能感兴趣的:(CCF)