[土狗之路]coursera C語言進階 習題 尋找平面上的極大點

這道題也是結構體比較簡單。

直接上題:

編程題#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章