ZOJ-2855-Google Map【4th浙江省赛】

56 篇文章 0 订阅
34 篇文章 0 订阅

ZOJ-2855-Google Map


                    Time Limit: 2 Seconds      Memory Limit: 65536 KB

GoogleMap is a useful tool and most of you should be familiar with it. As the best hacker in the world, Jack is planning to retrieve all the data on the GoogleMap server. But he soon gives up because the total amount of data exceeds 1000T bytes! But he has learnt the way in which Google stores their data on the server, and he turns to download only the parts that he’s interested in. Here is the representation of the data that Jack has found:

First of all, you should know the basic background knowledge of GIS (Geography Information System). In GoogleMap, the whole world is represented in a whole flat image transformed from the surface of the earth by Mercator projection. The Mercator projection is a map projection which is widely used for navigation. The following equations place the x-axis of the projection on the equator (from West to East) and the y-axis at longitude 0 (from South to North)

x = longitude * pi / 180;
y = ln(tan(pi / 4 + (latitude * pi / 180) / 2))

Here, the latitude is between [-85, 85] (negative for South) and the longitude is between [-180, 180] (negative for West) The left of the map image is W180 and the right is E180. The top of the map image is N85 and the bottom is S85. The maps have different levels. In the first level, the whole image consists of only one tile with tag name “t”. For each tile in one level, it will be clipped into 4 equally sized parts and magnified by 2 in the next level.
这里写图片描述

And the new tag name for the tiles in the next level will be the tag of their parent tile followed by the identifier of the clip area in the parent tile. (that is, q for left-top, r for right-top, t for left-bottom, s for right-bottom) For example:
这里写图片描述
So there will be 4L tiles in level L (Assume the first level is labeled as level 0). More interestingly, the filename of the tile on the server is just the tag name. Although Jack is very genius, he doesn’t know any programming language, so he turns to you for writing a tool to generate the tags for him.

Input
The input contains multiple test cases!

In each case, there will be three numbers. The first two are the coordinates that indicate the longitude and latitude of the interested location, and the third is the level number required by Jack.

The longitude is between [-180, 180] (negative for West) and the latitude is between [-85, 85] (negative for South)

Output
Output the tag for the tile in the specified level that contains the location in a single line.

You can assume that the location will not be at the boundary of any tiles.

Sample Input
80 33 2
-80 -33 4
72.12 46.68 10
Sample Output

trt
ttrqt
trtrstqsrqs

Notes
You can use the ‘log(double)’ function to calculate the natural logarithm, and ‘tan(double)’ to calculate the tangent value. Both of these functions are included in the header ’ < math.h > ’ for C or ’ < cmath >’ for C++.

题目链接:ZOJ-2855

题目大意:给出一个经纬度和地图等级,每个等级划分为q, r, t, s四块。x:-180~180;y: -85~85

题目思路:注意用公式转化地图坐标范围和输入的坐标

x = longitude * pi / 180;
y = ln(tan(pi / 4 + (latitude * pi / 180) / 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";
                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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值