NYOJ 一種排序
阿新 • • 發佈:2018-12-12
描述: 現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);
1.按照編號從小到大排序
2.對於編號相等的長方形,按照長方形的長排序;
3.如果編號和長都相同,按照長方形的寬排序;
4.如果編號、長、寬都相同,就只保留一個長方形用於排序,刪除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;
輸入 第一行有一個整數 0<n<10000,表示接下來有n組測試資料; 每一組第一行有一個整數 0<m<1000,表示有m個長方形; 接下來的m行,每一行有三個數 ,第一個數表示長方形的編號,
第二個和第三個數值大的表示長,數值小的表示寬,相等
說明這是一個正方形(資料約定長寬與編號都小於10000);
輸出 順序輸出每組資料的所有符合條件的長方形的 編號 長 寬 樣例輸入,
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
樣例輸出
1 1 1
1 2 1
1 2 2
2 1 1
2 2 1
程式碼部分:
#include <stdio.h> #include <string.h> int main() { int n,m; int a[1000],b[1000],c[1000]; scanf("%d",&n); while(n--) { scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%d %d %d",&a[i],&b[i],&c[i]); if(b[i]<c[i]) { int s=b[i]; b[i]=c[i]; c[i]=s; } } //按照序號,長,寬進行排序 for(int i=0;i<m-1;i++) { for(int j=i+1;j<m;j++) { if(a[i]>a[j] || (a[i]==a[j]&&b[i]>b[j]) || (a[i]==a[j]&&b[i]==b[j]&&c[i]>c[j]) ) { int s=a[i]; a[i]=a[j]; a[j]=s; s=b[i]; b[i]=b[j]; b[j]=s; s=c[i]; c[i]=c[j]; c[j]=s; } } } //刪除 序號,長,寬都相等的資料 for(int i=0;i<m-1;i++) { for(int j=i+1;j<m;j++) { if(a[i]==a[j]&&b[i]==b[j]&&c[i]==c[j]) { a[i]=0; } } } printf("--------------------\n"); // 輸出正確的排序結果 for(int i=0;i<m;i++) { if(a[i]!=0) printf("%d %d %d\n",a[i],b[i],c[i]); } } return 0; }
演算法核心: 1.邏輯運算子 && 優先順序比 || 優先順序高 ,同一優先順序從左往右計算。 如計算 : ( 1 && 0 || 0 || 1 && 1 || 0 && 1 || 1) 時 =={ ( 1 && 0 ) || 0 || ( 1 && 1 ) || ( 0 && 1 ) || 1 } //優先順序處理 == { 0 || 0 || 1 || 0 || 1 } //高優先順序計算結束 =={ ( 0 || 0 ) || 1 || 0 || 1 } //從左往右計算,依次 =={ ( 0 || 1 ) 0 || 1 } =={ ( 1 || 0 ) || 1 } =={ 1 || 1 } ==1