问题描述
试题编号: | 201912-2 |
试题名称: | 回收站选址 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: |
|
代码:本题不难,通过题的描述可以发现,关键在于:如何存储点(stl),如何直接由点判断此处是否有垃圾 (map)
坐标值范围比较大,而且坐标有可能是负数,难以用矩阵来存储坐标点,所以使用稀疏矩阵来存储。用STL的map来存储坐标是最为简单的。
如何存储点,可以用三种方法:
1、pair,而且临时创建一个pair也很方便
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