Radar Installation
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.
![](https://i-blog.csdnimg.cn/blog_migrate/f6ffe515205096387436c13c7449b0ed.jpeg)
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
题目的意思就是 :把x轴当作海岸线 , x轴上方为海 , 海中有许多小岛(用坐标表示), 在x轴要设置雷达 , 题目给了雷达的覆盖范围半径d, 问要把所有的小岛覆盖 所需雷达的最少数目 。
思路 :以小岛的坐标为圆心,以雷达的半径为半径画圆,会与x轴有一个或两个交点(也可能没有),两个圆可能会有重叠部分,只要雷达处于重叠部分内(图中x轴为黑色的部分),只用一个雷达将这两个岛屿覆盖。(见下图,可能画的不太标准,但是意思能表达清楚)。。
需要注意的是:
如果有一个小岛不能被覆盖的话 输出-1 但是输出的时候也要加上 Case %d 因为这个WA一次 ; 还有一点要想到的是 当给出的雷达半径为0 的时候 也是要输出-1 的 所以while(scanf ("%d%d",&m,&d)&&m&&d)这样是不对滴 又WA了好多。。。
总而言之题目不难 有了思路基本很快就能做出来,注意上边那段话。。
代码之后将会有许多测试数据 。。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double x[10000],y[10000],ll[10000],rr[10000],t;
int m,d,i,j;
int main ()
{
int l=1;
while (~scanf ("%d%d",&m,&d))
{
if (m==0 && d==0)
break;
int f=1,sum=1;
for (i=0; i<m; i++)
{
scanf ("%lf %lf",&x[i],&y[i]);
if (y[i]>d)
f=0;
}
if (f==0 || d==0)
{
printf ("Case %d: -1\n",l++);
continue;
}
for (i=0; i<m-1; i++)
{
for (j=0; j<m-1-i; j++)
{
if (x[j] > x[j+1])//按x轴排序
{
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
t=y[j];
y[j]=y[j+1];
y[j+1]=t;
}
}
}
for (i=0; i<m; i++)
{
double s = sqrt (d*d-y[i]*y[i]);
ll[i] = x[i] - s;
rr[i] = x[i] + s;
}
double x = rr[0];
for (i=1; i<m; i++)
{
if (ll[i] > x)//这里的意思就是如果下一个的ll坐标比上一个的rr坐标大的话,也就是两个圆没有重叠部分
{
x=rr[i];//x为下一个圆的rr坐标
sum++;
}
//另外为什么还要加下边这个if 呢 ??好好想想 就能明白
if (rr[i] < x)
{
x=rr[i];
}
}
printf ("Case %d: %d\n",l++,sum);
}
return 0;
}
测试数据:来自http://poj.org/showmessage?message_id=141734
2 5 -3 4 -6 3 4 5 -5 3 -3 5 2 3 3 3 20 8 -20 7 -18 6 -5 8 -21 8 -15 7 -17 5 -1 5 -2 3 -9 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 7 9 6 10 5 0 0 2 3 0 2 2 3 2 3 0 2 1 3 3 3 1 2 -3 2 2 4 8 5 2 4 -4 4 -3 3 -3 1 -3 0 -1 0 0 5 6 0 3 0 1 2 -3 1 2 1 3 2 1 2 -3 1 2 1 1 2 0 2 2 3 0 2 2 3 4 -5 4 3 4 3 2 3 6 -9 3 -3 1 2 -3 2 2 1 6 2 1 2 1 2 1 2 -3 1 2 1 0 0 1 2 0 2 2 3 0 2 1 3 3 10 1 10 2 3 4 5 3 5 1 10 2 3 4 5 4 7 1 10 2 3 4 5 0 0 3 9 1 10 2 3 4 5 0 0 ================结果 Case 1: 1 Case 2: 2 Case 3: 4 Case 4: 1 Case 5: 1 Case 6: -1 Case 7: 3 Case 8: -1 Case 9: 2 Case 10: 1 Case 11: 1 Case 12: -1 Case 13: -1 Case 14: 2 Case 15: 1 Case 16: 1 Case 17: 1 Case 18: -1 Case 19: -1 Case 20: -1