POJ Building a New Depot

1680 ワード

タイトル:
フェンスを建設し、フェンスの部分は横と縦の2つの方向しかなく、フェンスの角に点を計算し、フェンスのすべての点を与え、フェンスの全長を計算します.
問題解決の考え方:
1フェンスは複数の線分からなる、線分毎の長さは少なくとも1である.
2線分は横ではなく縦
3 x座標が等しい点またはy座標が等しい点の数は必ず偶数である.
4 x座標によって小さいから大きいまで並べ替えて、x座標は等しくy座標によって小さいから大きいまで並べ替えます
5配列を順次走査する、2点間の距離、すなわちlist[1]を1つずつ計算する.y-list[0].y ,list[3].y-list[2].y..,全長に距離を加える
6すべての点のx、y座標を交換し、手順4、5を繰り返します.
7結果を出力します.
コード:
#include<stdio.h>

typedef struct
{
	int x;
	int y;
} Point;

int cmp(const void *a, const void *b)
{
	Point *p1, *p2;
	p1 = (Point*)a;
	p2 = (Point*)b;
	if(p1->x != p2->x)
	  return p1->x - p2 -> x;
	else return p1->y - p2->y;
}

int calculateLen(Point* list, int n)
{
	int i,len;
	len=0;
	i=0;
	while(i<n) //   1    2     , 3    4     ,     
	{
		len += list[i+1].y - list[i].y;
		i += 2;
	}
	
	return len;
}

int main()
{
   int n,n_old; //    
   int i,temp;
   int len=0; //     
   Point *list; //    
	
   scanf("%d", &n);
   n_old=0;
   list=NULL;
   while(n)
   {
	len=0;
	if(n > n_old)
	{
	  if(list != NULL)  free(list);
	  list = (Point *)malloc(sizeof(Point)*n);
    }
	
	//  n  
	for(i=0; i<n; i++)
	{
		scanf("%d %d", &list[i].x, &list[i].y);
	}
	
	
	//  
	qsort(list, n, sizeof(Point), cmp) ;
	//          
	len += calculateLen(list, n);
	
	//  x、y   
	for(i=0; i<n; i++)
	{
		temp=list[i].x;
		list[i].x = list[i].y;
		list[i].y = temp;
	}
	//   
	qsort(list, n, sizeof(Point), cmp) ;
	//          
	len += calculateLen(list, n);
	
	//    
	printf("The length of the fence will be %d units.
", len); n_old=n; scanf("%d", &n); } return 0; }