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結果を出力します.
コード:
フェンスを建設し、フェンスの部分は横と縦の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;
}