⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 西电的VC++课上的几个通用模板,完全是可用的
💻
字号:
#include <fstream>
#include <iomanip>
#include <cmath>

using namespace std;
ifstream cin("t.in");
ofstream cout("t.out");
typedef struct
{
	char btEorW;        // 取值为1,东经; 0,西经;
	char btNorS;        // 取值为1,北纬; 0,南纬;    
	double dLong;       // 经度,取值范围[0.0,180.0)
	double dLat;        // 纬度,取值范围[0.0,90.0]
}ST_GlobePnt;

const char EAST = 1;
const char WEST = 0;
const char NORTH = 1;
const char SOUTH = 0;

const int EXC_OK = 0;        // 0:执行OK,返回值正确;
const int EorW_ERROR = 1;    // 1:东经、西经取值错误;
const int NorS_ERROR = 2;    // 2:南纬、北纬取值错误;
const int LONG_ERROR = 3;    // 3:经度范围越界;
const int LAT_ERROR = 4;     // 4: 纬度范围越界;
const int RADIUS_ERROR = 10;  // 10:半径取值错误(不能小于0)。

const double ACCURACY = 0.00001;    // 精确度 
const double PI = 3.14159265359;
const double radius = 1000.0; // 地球半径/////////****************************可改的,随球的半径而改

//函数实现
//辅助函数int CheckGPnt(const ST_GlobePnt &a_stPnt)
//功能判断点是否符合要求,实现如下:

int CheckGPnt(const ST_GlobePnt &a_stPnt)
{
    int iRet = EXC_OK; 
    // check if east or west 
    if(a_stPnt.btEorW != EAST && a_stPnt.btEorW != WEST)
    {
        iRet = EorW_ERROR;
        return iRet;
    }
    // check if nort or south
    if(a_stPnt.btNorS != NORTH && a_stPnt.btNorS != SOUTH)
    {
        iRet = EorW_ERROR;
        return iRet;
    }
    // check the range of Long.
    if(a_stPnt.dLong - 180.0 > ACCURACY || a_stPnt.dLong <= - ACCURACY)
    {
        iRet = LONG_ERROR;
        return iRet;        
    }
    // check the range of Lat
    if(a_stPnt.dLat - 90.0 > ACCURACY || a_stPnt.dLat <= -ACCURACY)
    {
        iRet = LAT_ERROR;
        return iRet;
    }    
    return iRet;
}

//接口函数如下:

int CalGlobeDistance(const ST_GlobePnt &a_stPntA,
                    const ST_GlobePnt &a_stPntB,
                    const double &a_dRadius,
                    double &a_dDistance)
{
	int iRet = EXC_OK;    
    a_dDistance = -1.0;

    double dTheta;    // the angle of the two Longs
    double dAlpha;    // the angle of a_stPntA's Lat
    double dBeta;     // the angle of a_stPntB's Lat   
    double dResult;   // the angle of the two lines 
                       //     which one is through the given point and the center
     double dCosResult; // = cos(dResult);

   // Check if the given points is OK --Begin-------    
    iRet = CheckGPnt(a_stPntA);
    if(iRet != EXC_OK)
    {
        return iRet;
    }

    iRet = CheckGPnt(a_stPntB);
    if(iRet != EXC_OK)
    {
        return iRet;
    }

   // Check if the given points is OK --End---------  
   // check the range of Radius
    if(a_dRadius < -ACCURACY)
    {
        iRet = RADIUS_ERROR;
        return iRet;
    }

    dAlpha = a_stPntA.dLat;
    dBeta = a_stPntB.dLat;

    // Calculate the the angle of the two Longs --- Begin --------
    if(a_stPntA.btEorW == a_stPntB.btEorW)
    {
        dTheta = fabs(a_stPntA.dLong - a_stPntB.dLong);    
    }else // !=
    {
        dTheta = a_stPntA.dLong + a_stPntB.dLong;
    }

    if(dTheta - 180.00 > -ACCURACY)
    {
        dTheta = 360.0 - dTheta;
    }
    // Calculate the the angle of the two Longs --- End --------  
	// Change DEGREE to RADIAN     --- Begin ------
    dAlpha = dAlpha / 180.0 * PI;
	dBeta = dBeta / 180.0 * PI;
	dTheta = dTheta / 180.0 * PI;
    // Change DEGREE to RADIAN     --- End ------  
    
	// Calculate the angle of the two lines  --- Begin ---------
    if(a_stPntA.btNorS != a_stPntB.btNorS)
    {
        dCosResult = cos(dAlpha) * cos(dBeta) * cos(dTheta) - sin(dAlpha) * sin(dBeta);
    }else // !=
    {
        dCosResult = cos(dAlpha) * cos(dBeta) * cos(dTheta) + sin(dAlpha) * sin(dBeta);
    }

    dResult = acos(dCosResult);//  dResult ranges [0,Pi],needn't change
    // Calculate the angle of the two lines  --- End ---------
    // Get the distance around the globe

    a_dDistance = a_dRadius * dResult;            
    return iRet;

}

//******************************************************MY
上面是模板,不得修改!!!!!!!!!!!!!!!!
*****************************************************************/
ST_GlobePnt point[1000];
double ma[1000];
int mi,n;
void findMi(){
	double d=0;
	int i,j;
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
		   CalGlobeDistance(point[i],point[j] , 1.0 ,d);
		   if(d>ma[i]) ma[i]=d;
		}
	}
	d=1e100;
	for(i=0;i<n;i++){
		if(d>ma[i]) {  d=ma[i]; mi=i;}
	}
}


int main(){
	int i;
	cin>>n;
	double a,b;
	for(i=0;i<n;i++){
		cin>>a>>b;
		if(a>=0){
			point[i].btNorS=1; point[i].dLat=a; 
		}
		else { point[i].btNorS=0; point[i].dLat=-a;
		}
		if(b>=0){
			point[i].btEorW=1; point[i].dLong=b;
		}
		else { point[i].btEorW=0; point[i].dLong=-b;
		}
	}
	findMi();
	if(point[mi].btNorS==0) a=-point[mi].dLat;
	else a=point[mi].dLat;
	if(point[mi].btEorW==0) b=-point[mi].dLong;
	else b=point[mi].dLong;
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<a<<' '<<b<<endl;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -