uva 10553 Treasure Map (指南针偏差航海寻宝)

原创 2016年05月31日 20:36:34

题意:给了一张地图,按照正常的路线,可以恰好到达那个有宝藏的小岛,由于地理北极和地磁北极方向有别,导致每次转向都有角度偏差,求按照地图航行过程中,距离小岛的最短路径

分析:先求出小岛位置,然后按照偏差计算,每条直线距离小岛距离,取最小即可

#include <bits/stdc++.h>
#include <iostream>

using namespace std;
const double eps = acos(-1.0);
int  n;
double num;
string str[32] = {"N", "NbE", "NNE", "NEbN", "NE", "NEbE", "ENE", "EbN", "E", "EbS", "ESE", "SEbE", "SE", "SEbS", "SSE",
"SbE", "S", "SbW", "SSW", "SWbS", "SW", "SWbW", "WSW", "WbS", "W", "WbN", "WNW", "NWbW", "NW", "NWbN", "NNW", "NbW"
};
struct Point
{
    double x;double y;
    Point(){};   //不加这一句,有的编译器会报错,no matching function for call to ...
    Point(const double xx,const double yy)
    {
        x = xx; y = yy;
    }
};
struct Road
{
    double x;
    double y;
    Road(const double xx,const double yy)
    {
        x = xx; y = yy;
    }
};
map<string,double> direction;
vector<Road> road;
void init()
{
    for(int i = 0; i < 32; i++)
    {
        direction[str[i]] = eps*i/16;
    }
}
void read()
{
    road.clear();
    string str0;
    double num0;
    for(int i = 0; i< n; i++)
    {
        cin >> str0 >> num0;
        road.push_back(Road(direction[str0],num0));

    }
    cin >> num;
    num = num *eps /180;
}
double dis(Point p1,Point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y));
}
double dot(Point p0,Point p1,Point p2){  //p0p1点乘 p0p2;
	return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}

struct line{
	Point a,b;
	line(const Point a0,const Point b0){a=a0;b=b0;}
	double getdis(Point p){//点到线段的最小距离
		if(dot(a,p,b)<0 || dot(b,p,a)<0) return min(dis(p,a),dis(p,b));
		else{
			double a0,b0,c0;
			a0=a.y-b.y;
			b0=b.x-a.x;
			c0=a.x*b.y-b.x*a.y;
			return fabs(a0*p.x+b0*p.y+c0)/sqrt(a0*a0+b0*b0);
		}
	}
};
void computing()
{
    Point d(0,0),t(0,0),pre;
	for(int i=0;i<n;i++){
		d.x+=cos(road[i].x)*road[i].y;
		d.y+=sin(road[i].x)*road[i].y;
	}
	double ans=dis(d,t);
	for(int i=0;i<n;i++){
		pre=t;
		t.x+=cos(road[i].x-num)*road[i].y;
		t.y+=sin(road[i].x-num)*road[i].y;
		line l(pre,t);
		ans=min(ans,l.getdis(d));
	}
	printf("%.2lf\n",ans);
}
int main()
{

    init();
    while(scanf("%d",&n)&&n)
    {
        read();
        computing();
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVA, 10180 Rope Crisis in Ropeland!

题意:求两点之间的最短距离,如果两点穿过圆,则距离是两条切线加一段弧长,图上有。 分析: 用三角形的余弦定理和正弦定理,可以求出相应的一些角度,其实这道题就是一个简单的几何问题,几何会做这道题就会了...

UVa 10180 - Rope Crisis in Ropeland!

题目:平面中有两个点A,B,还有一个圆心在(0,0)半径为R的圆,问连接A,B的不穿过圆的最短弧长。 分析:计算几何。分两种情况计算:AB线段不穿过圆,AB线段穿过圆;             1...

uva 10553 Treasure Map

题意:给你海盗的航海路线,终点为宝藏地点,然后你的路线是按照海盗的航海路线偏移一定的角度去航行,求你在途中距离宝藏最近的是相距多少。 分析:先求出宝藏地点,然后求出宝藏地点到你航行的所有边的距离 ...

Poj 1066 Treasure Hunt && Nyoj 83 迷宫寻宝(二)判断线段相交

题目链接:poj 1066         nyoj 83

UVa #12325 Zombie's Treasure Chest (例题7-11)

书中的分类枚举法一举克服了普通枚举最大10^9的规模: 第一种宝藏最多n/s1个,所以宝藏1的数量可以从1枚举到n/s1,同时算出宝藏2最多多少个,求出总价值。 宝藏2最多n/s1个,枚举...

Uva12325 Zombie's Treasure Chest【分类枚举】【例题7-11】

找条件分类枚举
  • GuoZLH
  • GuoZLH
  • 2017年02月20日 11:11
  • 196

微信小程序开发——map地图组件,定位,并手动修改位置偏差。

环境搭建 注册,获取APPID(没有这个不能真鸡调试)下载微信web开发者工具(挺多bug,将就用)打开微信web开发者工具,扫码登录,新建小程序,输入APPID,勾选创建quick start项目...

ZOJ 3209 Treasure Map(精确覆盖问题&舞蹈链)

题目链接:[kuangbin带你飞]专题三 Dancing Links B - Treasure Map题意 给一矩形和k个小矩形,问选取最小数量为多少的小矩形可以对大矩形进行精确覆盖。 思路 ...

ZOJ 3209 Treasure Map(Dancing Links)(精确覆盖问题)

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3209 解题思路: 题目大意: 给你一个n*m的矩形,有p个小...

ZOJ 3209 Treasure Map (DLX精确覆盖问题)

题目大意: 给出一个n*m的矩形, n, m 大致思路: 就是将n*m个小的1*1的正方形视作一个单位做精确覆盖问题就好了 最坏情况下900列, 500行, 直接用DLX就可以 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva 10553 Treasure Map (指南针偏差航海寻宝)
举报原因:
原因补充:

(最多只允许输入30个字)