「csp 模擬試題 201912-2」回收站選址 C/C++
目錄
題目
輸入輸出樣例
題解思路
題解原始碼(c/c++)
題目 :回收站選址
【題目背景】
開學了,可是校園裡堆積了不少垃圾雜物。
熱心的同學們紛紛自發前來清理,為學校注入正能量~
【問題描述】
通過無人機航拍我們已經知曉了 n 處尚待清理的垃圾位置,其中第 i(1<=i<=n)處的座標為(x,y),保證所有的座標均為整數。
我們希望在垃圾集中的地方建立些回收站。具體來說,對於一個位置(x, y)是否適合建立回收站,我們主要考慮以下幾點:
-
(x, y)必須是整數座標,且該處存在垃圾;
-
上下左右四個鄰居位置,即(x, y+1),(x, y-1),(x+1, y)和(x-1, y)處,必須全部存在垃圾;
-
進一步地,我們會對滿足上述兩個條件的選址進行評分,分數為不大於 4 的自然數,表示在(x±1,y±1)四個對角位置中有幾處存在垃圾。
現在,請你統計一下每種得分的選址個數。
【輸入格式】
從標準輸入讀入資料。輸入總共有 n+1 行。
第 1 行包含一個正整數 n,表示已查明的垃圾點個數。
第 1+i 行(1<=i<=n)包含由一個空格分隔的兩個整數 xi 和 yi,表示第 i 處垃圾的座標。
保證輸入的 n 個座標互不相同。
【輸出格式】
輸出到標準輸出。
輸出共五行,每行一個整數,依次表示得分為 0、1、2、3 和 4 的回收站選址個數。
輸入輸出樣例
輸入樣例1
7
1 2
2 1
0 0
1 1
1 0
2 0
0 1
輸出樣例1
0
0
1
0
0
樣例 1 解釋
如圖所示,僅有(1,1)可選為回收站地址,評分為 2。
輸入樣例2
2
0 0
-100000 10
輸出樣例2
0
0
0
0
0
樣例 2 解釋
不存在可選地址。
輸入樣例3
11
9 10
10 10
11 10
12 10
13 10
11 9
11 8
12 9
10 9
10 11
12 11
輸出樣例3
0
2
1
0
0
樣例 3 解釋
1 分選址:(10,10)和(12,10);
2 分選址:(11,9)
【子任務】
測試點 1 和 2,保證對於任意的 i 皆滿足 0<=xi, yi<=2;
測試點 3、4 和 5,保證對於任意的 i 皆滿足 0<=xi, yi<= 500;
測試點 6、7 和 8,保證對於任意的 i 皆滿足 0<=xi, yi<= 10^9;
測試點 9 和 10,保證對於任意的 i 皆滿足|xi|, |yi|<=10^9,即座標可以是負數。
所有的測試點保證 1<=n<=10^3。
【提示】
本題中所涉及的座標皆為整數,且保證輸入的座標兩兩不相同。
題解思路
這道題本來我想用圖搜尋去做,結果題目的子任務中,說了
座標可以是負數
。顯然不能單純的用下標來表示座標值。還是直接暴力 for 迴圈判斷吧。
用結構體儲存座標值,先
check
點是否能滿足回收站的建立。將滿足條件的回收站再statistic
得分數。
題解(c/c++)
#include<bits/stdc++.h>
using namespace std;
struct P{
int x,y;
};
/* 全域性變數 */
int n,grades[5]={0};
P points[1001];
bool check(int x,int y){
int Four=0;
for(int i=0;i<n;i++){
if(x-1==points[i].x&&y==points[i].y){
Four++;
}
if(x+1==points[i].x&&y==points[i].y){
Four++;
}
if(x==points[i].x&&y-1==points[i].y){
Four++;
}
if(x==points[i].x&&y+1==points[i].y){
Four++;
}
}
if(Four==4){
return true;
}
return false;
}
int statistic(int x,int y){
int grade=0;
for(int i=0;i<n;i++){
if(x-1==points[i].x&&y-1==points[i].y){
grade++;
}
if(x-1==points[i].x&&y+1==points[i].y){
grade++;
}
if(x+1==points[i].x&&y-1==points[i].y){
grade++;
}
if(x+1==points[i].x&&y+1==points[i].y){
grade++;
}
}
return grade;
}
int main() {
cin>>n;
for(int i=0;i<n;i++){
cin>>points[i].x>>points[i].y;
}
for(int i=0;i<n;i++){
if(check(points[i].x,points[i].y)){
grades[statistic(points[i].x,points[i].y)]++;
}
}
for(int i=0;i<5;i++){
cout<<grades[i]<<endl;
}
}