生活随笔
收集整理的這篇文章主要介紹了
【2012百度之星 / 资格赛】I:地图的省钱计划
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述 百度地圖有自己的一套坐標(biāo)系(你可以把它看作一個(gè)笛卡爾坐標(biāo)系),在這套坐標(biāo)系里,一個(gè)標(biāo)準(zhǔn)單位為1km。而在這坐標(biāo)系上針對(duì)地理信息進(jìn)行標(biāo)注的數(shù)據(jù),大多數(shù)時(shí)候是通過購買的方式完成的。為了節(jié)約數(shù)據(jù)更新的成本,數(shù)據(jù)組里的鑫哥想出了一個(gè)好主意——自己測(cè)數(shù)據(jù)。 鑫哥按照他的預(yù)想開始實(shí)驗(yàn);在每組試驗(yàn)中,鑫哥選取了三個(gè)已經(jīng)被準(zhǔn)確標(biāo)注在百度地圖的坐標(biāo)系里的移動(dòng)運(yùn)營(yíng)商的基站作為信號(hào)接收點(diǎn)(這里可以準(zhǔn)確的得到信號(hào)的接收時(shí)間信息)。當(dāng)信號(hào)接收點(diǎn)附近的用戶手機(jī)簽到時(shí),三個(gè)信號(hào)接收點(diǎn)就會(huì)先后接收到這個(gè)信號(hào),并可以準(zhǔn)確的知曉接收到信號(hào)的時(shí)間(將第一個(gè)信號(hào)點(diǎn)接收到信號(hào)的時(shí)間記為0秒時(shí)刻)。由此,我們就可以確定用戶手機(jī)簽到的位置的在地圖的準(zhǔn)確坐標(biāo)了。 現(xiàn)在已知以下數(shù)據(jù): 1.三個(gè)信號(hào)接收點(diǎn)在百度地圖坐標(biāo)系中的具體坐標(biāo)(x1,y1), (x2,y2), (x3,y3); 2.三個(gè)信號(hào)點(diǎn)得到用戶發(fā)出的信號(hào)的時(shí)間t1, t2, t3(t1, t2, t3 ≥ 0),單位s; t1, t2, t3至少有一個(gè)數(shù)為0; 3.信號(hào)的轉(zhuǎn)播速度C,單位m/s; 請(qǐng)幫助鑫哥寫個(gè)程序,計(jì)算下用戶發(fā)出信號(hào)的位置在百度地圖坐標(biāo)系內(nèi)的坐標(biāo)(這個(gè)點(diǎn)是唯一的)。
輸入 輸入包含多組數(shù)據(jù),每組數(shù)據(jù)格式如下: C x1 y1 x2 y2 x3 y3 t1 t2 t3 最后一組數(shù)據(jù)為0,表示輸入結(jié)束。 輸出 針對(duì)每組測(cè)試數(shù)據(jù),請(qǐng)先輸出這個(gè)組的編號(hào)(第n組就是輸出“Case n:”);然后換行輸出信號(hào)發(fā)出點(diǎn)的坐標(biāo)(x,y) 。x,y應(yīng)該由空格分隔,并被舍入到小數(shù)點(diǎn)后第六位。 樣例輸入 1000
0 1 1 1 2 1
0 0.6 1.6
1000
0 0 0 1 1 0
0.4142135 0 0
1000
0 0 1 0 2 1
0 0.414213562373 1
1000
0 0 0 -1 0 1
0 0 1
1000
0 0 0 1 0 -1
0 1 0
1000
0 0 1 0 -1 0
0 1 0
1000
0 0 -1 0 1 0
0 0 1
100
0 0 0 1 1 0
0 10 10
0 樣例輸出 Case 1:
0.200000 1.000000
Case 2:
1.000000 1.000000
Case 3:
0.000000 1.000000
Case 4:
0.000000 -0.500000
Case 5:
0.000000 -0.500000
Case 6:
-0.500000 0.000000
Case 7:
-0.500000 0.000000
Case 8:
0.000000 0.000000
主要思路:這個(gè)題用三角函數(shù)來解方程會(huì)很方便的,通過將兩個(gè)方程轉(zhuǎn)化為一個(gè)三角函數(shù)方程,然后求角度cita和半徑r就可以了(特別說明:最后那個(gè)分式中的分母部分中的l2、l3是沒有平方的)。
實(shí)現(xiàn)代碼:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double x[4], y[4], t[4];void solve(int i , int j , int k)
{double x2, y2, x3, y3, l2, l3 , sum , fai , cita , r , m , n;?? //citax2 = x[j] -x[i] , y2 = y[j] -y[i];x3 = x[k] -x[i] , y3 = y[k] -y[i];l2 = t[j] -t[i] , l3 = t[k] -t[i];m = x2*x2 + y2*y2 - l2*l2 , n = x3*x3 + y3*y3 - l3*l3;// 得到方程 a*sin(cita) + b*cos(cita) = -cdouble a = m*y3-n*y2 ;?? //sin(cita)的系數(shù)double b = m*x3-n*x2 ;?? //cos(cita)的系數(shù)double c = m * l3 - n * l2;// 得到方程 sin(cita+fai) = -c/(sqrt(a*a+b*b))fai = atan2(b, a) ;???? //先求出角度faisum = asin(- c/sqrt(a*a+b*b+1e-15));??? //通過反正弦函數(shù)求出cita+fai的角度和cita = sum - fai;????? // 此時(shí)cita是一個(gè)銳角if (abs(m)>abs(n))r = m/(l2 + x2 *cos(cita) + y2 * sin(cita))/2;elser = n/(l3 + x3 *cos(cita) + y3 * sin(cita))/2;if(r < 0){sum = - sum + 3.141592653579;??? //r<0,說明不能是銳角,應(yīng)該是個(gè)鈍角cita = sum - fai;if (abs(m)>abs(n))r = m/(l2 + x2 *cos(cita) + y2 * sin(cita))/2;elser = n/(l3 + x3 *cos(cita) + y3 * sin(cita))/2;}printf("%.6f %.6f\n", r * cos(cita) + x[i], r * sin(cita) + y[i]);
}
int main(void)
{int num = 1;double c;while(scanf("%lf", &c)!=EOF){c/=1000;if (abs(c) < 1e-6)break;scanf("%lf %lf %lf %lf %lf %lf", x, y, x+1, y+1, x+2, y+2);scanf("%lf %lf %lf", t, t+1, t+2);printf("Case %d:\n", num++);t[0] *= c;t[1] *= c;t[2] *= c;solve(0, 1, 2);}return 0;
}
總結(jié)
以上是生活随笔 為你收集整理的【2012百度之星 / 资格赛】I:地图的省钱计划 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。