1. 程式人生 > 其它 >「csp 模擬試題 201912-2」回收站選址 C/C++

「csp 模擬試題 201912-2」回收站選址 C/C++

技術標籤:筆記cspC++cspc++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;
    }
}