1. 程式人生 > >NYOJ 一種排序

NYOJ 一種排序

描述: 現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);

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