POJ1328 Radar Installation

题目大意:

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

算法思路:

       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;
}


 

posted on 2015-06-11 10:31  kma  阅读(86)  评论(0编辑  收藏  举报

导航