CCF201912-2 回收站選址


 

 

 

 

 

 解題思路:這道題唬人的在於坐標有正有負哈,剛開始不知道怎么下爪,仔細思考過后,我可是會面向對象編程的啊哈哈哈哈,我可是最喜歡封裝了哈哈哈哈。

1.首先可以把每個點用一個結構體來定義,包含他的x,y坐標,以及該點的得分情況。因為最大有1000個點,可以再定義一個點的數組來存放輸入的點。

2.點存儲了之后我們就可以來對數據進行處理了,首先遍歷數組得到可以作為選址點的Node,將可以作為選址點的Node用一個容器(vector)存起來。

3.我們得到可以用作選址的點之后,就可以對每個點進行評分了,然后將評分結果輸出就ok了!

 

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

struct Node {
    int x;
    int y;
    int score;
} node[1000];

/*
    判斷節點1和節點2是否相鄰
*/
bool IsAdjacent(Node n1, Node n2) {
    if (abs(n1.x - n2.x) == 1 && n1.y==n2.y || abs(n1.y - n2.y) == 1 && n1.x==n2.x) return true;
    else  return false;
}
/*
判斷是否得分
*/
bool IsgetScore(vector<Node>::iterator vit, Node n) {
    if (abs(vit->x - n.x) == 1 && abs(vit->y - n.y) == 1) return true;
    else return false;
}
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> node[i].x >> node[i].y;//輸入點坐標
    }
    
    vector<Node> xz;//可作為選址的節點
    int count = 0;//記錄上下左右是否均存在垃圾的值=4說明均存在,不等於說明不存在
    for (int i = 0; i < n; i++) {
        count = 0;//每個節點開始前先清零
        for (int j = 0; j < n; j++) {
            if (IsAdjacent(node[i], node[j])) count++;
        }
        if (count == 4) xz.push_back(node[i]);//當前節點可以作為選址的節點
    }

    int s[5] = {0};//最后的輸出得分數組
    vector<Node>::iterator vit;
    //判斷可作為選址的節點能得多少分
    for (vit = xz.begin(); vit != xz.end(); vit++) {
        for (int i = 0; i < n; i++) {
            if (IsgetScore(vit, node[i])) vit->score++;//對節點得分數++操作
        }
        s[vit->score]++;//得分為vit—>socre的元素個數加一
    }
    //輸出結果數組
    for (int i = 0; i < 5; i++) {
        cout << s[i] << endl;
    }

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM