您的位置:首页 > 其它

POJ1328 Radar Installation

2015-06-11 10:30 218 查看
题目大意:

        在一个海上有好多岛屿,想要在海滩上建立雷达给所有岛屿进行通信,雷达通信有范围限制,要求出在给出固定岛屿坐标后至少需要建立多少雷达。

算法思路:

       1) 获取岛屿坐标及雷达通信范围后,计算出该岛屿能够与海滩通信的区域范围,

       2)计算出每个岛屿的在海滩的通信范围后,对每个节点的通信范围的左左边进行排序。

       3)求出公共区域的数量即得到需要建立雷达的数量

 

特殊情况注意:

     不能忽略雷达的通信半径为0的情况(我就是就被这个边界条件坑惨了。。。)

// Radar_Installation.cpp : Defines the entry point for the console application.
//poj1328
//

//#include "stdafx.h"
#include <stdio.h>
#include <math.h>

#define maxNode 1000

struct island
{
int x;    //value of x-axis
int y;    //value of y-axis
double leftValue;
double rightValue;
};
struct island landArray[maxNode];

//计算改坐标可以在X轴上可以覆盖的范围
void calCenter(int index,int radius){
int x = landArray[index].x;
int y = landArray[index].y;
double temp = (radius*radius) - (y*y);
landArray[index].leftValue = x - sqrt(temp);
landArray[index].rightValue = x + sqrt(temp);

}

//对于所有的坐标按照可以在X轴上覆盖范围的左边点位置进行排序
void restoreArray(int length){
//冒泡排序
struct island temp;
for(int i = 0; i< length; i++)
{
for(int j = 0; j< (length-i-1); j++){
if(landArray[j].leftValue > landArray[j+1].leftValue){
temp = landArray[j];
landArray[j] = landArray[j+1];
landArray[j+1] = temp;
}
}
}
}
// 求出两个岛屿建立雷达的公共区域
bool caluCommon(int index1, int index2){
double index1_left = landArray[index1].leftValue;
double index1_right = landArray[index1].rightValue;
double index2_left = landArray[index2].leftValue;
double index2_right = landArray[index2].rightValue;
if(index1_right < index2_left)
return false; //公共区域没有交集直接返回false
else if(index1_right == index2_left){
landArray[index2].leftValue = index2_left;
landArray[index2].rightValue = index1_right;
return true;
}
else{
if(index2_right > index1_right){
landArray[index2].leftValue = index2_left;
landArray[index2].rightValue = index1_right;
return true;
}else{
landArray[index2].leftValue = index2_left;
landArray[index2].rightValue = index2_right;
return true;
}
}
}

int main()
{
int radius = 0;
int numOfIsland = 0;
int numOfRadio = 0;
int testCase = 0;
bool calNumOfRadio = true;
bool noSolution = false;

//freopen("input.txt", "r", stdin);
//freopen("test.txt", "r", stdin);
// setbuf(stdout, NULL);

while(calNumOfRadio){
scanf("%d", &numOfIsland);
scanf("%d", &radius);

if((numOfIsland == 0) && (radius == 0)) // end
break;
testCase++;
for(int i=0; i< numOfIsland; i++){ // 输入岛屿坐标
scanf("%d",&(landArray[i].x));
scanf("%d",&(landArray[i].y));
if(landArray[i].y > radius){ //遇到岛屿的距离大于半径的情况
noSolution = true;
//break;  //遇到这种情况需要继续完成本次输入,否则会影响下一个测试case的数据源
}
if(!noSolution)
calCenter(i,radius);
}
if(noSolution){   //输入无方案情况
printf("Case %d: -1\n",testCase);
noSolution = false;
numOfRadio = 0;
}else{
restoreArray(numOfIsland); // 对每个岛屿可以在海岸的雷达覆盖范围 进行排序
for(int i = 0;i< numOfIsland; i++){
while((i+1 < numOfIsland) && caluCommon(i,(i+1))){  //计算公共区域
i++;
continue;
}
numOfRadio++; //公共区域无交集 雷达加1
}
printf("Case %d: %d\n",testCase,numOfRadio);
numOfRadio = 0;
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: