2020年1月9日 星期四

排序問題

題目:
有N個在二維座標系上的點,以Pi=(xi,yi)表示第i個點。寫一個程式將這些點從左下到右上進行排序(以遞增、x值優先的方式排序)。

輸入:
輸入第一行為一整數N,代表接下來有幾個點座標。假設0<N<=0,接下來N行每一行包含兩個數字,以空白隔開,分別代表點座標的x與y值。

輸出:
輸出排序後的點座標。
如果N超過範圍,輸出錯誤訊息"invalid number of points"。

範例輸出:















解題思路:
以泡沫排序法排序,記得x值跟y值都要交換,然後再跑一次確定若x值相同時y的大小。


程式碼:
#include <stdio.h>

int main()
{
 int n;
 float a[10][2] = { 0 };
 printf("Enter number of points: ");
 scanf_s("%d", &n);
 if (n >= 0 || n < 10)
  printf("invalid number of points.\n");
 else
 {
  for (int i = 0; i < n; i++)
   scanf_s("%f %f", &a[i][0], &a[i][1]);
  for (int i = 0; i < n; i++)
  {
   for (int j = 0; j < n; j++)
   {
    if (a[i][0] < a[j][0])
    {
     float temp = a[i][0];
     a[i][0] = a[j][0];
     a[j][0] = temp;
     temp = a[i][1];
     a[i][1] = a[j][1];
     a[j][1] = temp;
    }
   }
  }
  for (int i = 0; i < n - 1; i++)
  {
   if (a[i][0] == a[i + 1][0] && a[i][1] > a[i + 1][1])
   {
    float temp = a[i][1];
    a[i][1] = a[i + 1][1];
    a[i + 1][1] = temp;
   }
  }
  printf("\n");
  printf("Sorted result:\n");
  for (int i = 0; i < n; i++)
   printf("%.2f %.2f\n", a[i][0], a[i][1]);
 }
 
 return 0;
}

沒有留言:

張貼留言