這道題也是結構體比較簡單。
直接上題:
編程題#4:尋找平面上的極大點
來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 內存限制: 65536kB
描述
在一個平面上,如果有兩個點(x,y),(a,b),如果說(x,y)支配了(a,b),這是指x>=a,y>=b;
用圖形來看就是(a,b)坐落在以(x,y)爲右上角的一個無限的區域內。
給定n個點的集合,一定存在若干個點,它們不會被集合中的任何一點所支配,這些點叫做極大值點。
編程找出所有的極大點,按照x座標由小到大,輸出極大點的座標。
本題規定:n不超過100,並且不考慮點的座標爲負數的情況。
輸入
輸入包括兩行,第一行是正整數n,表示是點數,第二行包含n個點的座標,座標值都是整數,座標範圍從0到100,輸入數據中不存在座標相同的點。
輸出
按x軸座標最小到大的順序輸出所有極大點。
輸出格式爲:(x1,y1),(x2,y2),...(xk,yk)
注意:輸出的每個點之間有","分隔,最後一個點之後沒有",",少輸出和多輸出都會被判錯
樣例輸入
5 1 2 2 2 3 1 2 3 1 4
樣例輸出
(1,4),(2,3),(3,1)
然後是代碼:
#include<iostream>
using namespace std;
struct point {//用以記錄每一個點
int x;//橫座標
int y;//縱座標
};
int main() {
int n;
cin >> n;
point points[100];//從來接受所有的點
for (int i = 0; i < n; i++)
cin >> points[i].x >> points[i].y;
point maxs[100];//用來保存所有的極大點
int k = 0;
for (int i = 0; i < n; i++) {
bool max = true;//初始化這個點沒有被支配
for (int j = 0; j < n; j++) {
if (j== i)
continue;
else if (((points[j].x >= points[i].x)&&(points[j].y >= points[i].y)) == true)//判斷是否被支配,如果支配,則將max改爲假
max = false;
}
if (max == true) {//把沒有被支配的點保存下來
maxs[k] = points[i];
k++;
}
}
k--;//因爲之前最後一次多了一個k++,所以這裏-回來
for (int i = 0; i < k + 1; i++) {//排序
for (int j = i+1; j < k + 1; j++) {
if (maxs[i].x > maxs[j].x) {
point temp = maxs[i];
maxs[i] = maxs[j];
maxs[j] = temp;
}
else if (maxs[i].x == maxs[j].x&&maxs[i].y > maxs[j].y) {
point temp = maxs[i];
maxs[i] = maxs[j];
maxs[j] = temp;
}
}
}
for (int i = 0; i < k+1 ; i++) {//輸出,最後一次沒有,
cout << '(' << maxs[i].x << ',' << maxs[i].y << ')';
if (i == k)
cout << endl;
else
cout << ',';
}
return 0;
}