Description
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
![](http://poj.org/images/1328_1.jpg)
Figure A Sample Input of Radar Installations
Input
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.
The input is terminated by a line containing pair of zeros
The input is terminated by a line containing pair of zeros
Output
For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case.
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
注意变量的初始化位置,最好在使用前初始化,如果出现错误,很难查找。
注意cmp函数的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 typedef struct 6 { 7 double l; 8 double r; 9 }Area; 10 Area area[1000]; 11 12 int cmp(const void *a,const void *b) 13 { 14 Area *A_a=(Area *)a; 15 Area *A_b=(Area *)b; 16 return (*A_a).l>(*A_b).l?1:-1; 17 } 18 19 int main() 20 { 21 int n,d,x,y,flag,case_num,num=1; 22 while(cin>>n>>d&&!(n==0&&d==0)) 23 { 24 flag=0; 25 26 for(int i=0;i<n;i++) 27 { 28 cin>>x; 29 cin>>y; 30 if(y<=d&&flag==0) 31 { 32 area[i].l=x-sqrt(double(d*d-y*y)); 33 area[i].r=x+sqrt(double(d*d-y*y)); 34 } 35 else flag=1; 36 } 37 38 if(flag==1) 39 { 40 cout<<"Case "<<num<<": "<<-1<<endl; 41 num++; 42 continue; 43 } 44 qsort(area,n,sizeof area[0],cmp); 45 46 double right=area[0].r; 47 case_num=1; 48 49 for(int i=1;i<n;i++) 50 { 51 if(area[i].l>right) 52 { 53 case_num++; 54 right=area[i].r; 55 } 56 else if(area[i].r<right) right=area[i].r; 57 } 58 59 cout<<"Case "<<num<<": "<<case_num<<endl; 60 num++; 61 } 62 return 0; 63 }