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