*pi的的表示方法原来是acos(-1),第一次听同学这么告诉我,不过记住就行了。
*公式中的ln要换成log。
思路:
题目很长,但其实很简单,同学给解释了一下,一下子就明白了。输入经度、纬度、查询次数,
1.通过给出的公式,把经度纬度转换成x,y,查询该点在地图上的位置(右上右下左上左下)并用给定的字符表示,注意看已给条件,第一次(level 0)位置不细分,第一个位置肯定是t,再对所在点当前的单元格细分,分成四块,再看点在哪里。
2.后面二分查询下就好了。
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
#define pi acos(-1.0)
int main(){
double x,y;
int level;
while(cin >> x >> y >> level)
{
double top = log(tan(pi / 4 + (85 * pi / 180) / 2));
double down = log(tan(pi / 4 + (-85 * pi / 180) / 2));
double left = -180 * pi / 180;
double right = 180 * pi / 180;
string ans = "t";
x = x * pi / 180;
y = log(tan(pi / 4 + (y * pi / 180) / 2));
while(level--)
{
double mid_x = (left + right) / 2;
double mid_y = (top + down) / 2;
if (x < mid_x && y < mid_y)//判断点在当前格子的那个部分
{
ans += "t";//string可以直接加的,char不行
top = mid_y;
right = mid_x;
}
else if (x < mid_x && y > mid_y)
{
ans += "q";
down = mid_y;
right = mid_x;
}
else if (x > mid_x && y < mid_y)
{
ans += "s";
top = mid_y;
left = mid_x;
}
else if (x > mid_x && y > mid_y)
{
ans += "r";
down = mid_y;
left = mid_x;
}
}
cout << ans << endl;
}
return 0;
}