题目来源
浙财OJ
题目描述
为增进同学们彼此间的了解,9月中旬,信息学院举行智力游戏大赛,各班派代表参赛,对于每道题可协商后答题,同时可带笔记本电脑编程序实现。现有《海盗埋宝》一题,大意如下:
1.海盗以岛上的一颗大树为参照物,将所获得的宝物以一定规则埋藏在大树的周围。
2.埋藏的规则如下:将大树的位置记为坐标原点(0,0);以海盗的步长为标准长度1;海盗行走的方向为八个标准方向:N(north)、NE(northeast)、E(east)、SE(southeast)、S(south)、SW(southwest)、W(west)和NW(northwest);同时海盗行走表示方法为:3W表示往西走3步长,17NE表示往西北走17步长。
3.海盗将所走的方位记载在本子上,专门保管,需要时根据这些信息来挖宝。
本题要求解的是:给定海盗藏宝的行走过程,求宝藏埋藏的位置以及宝藏距大树的直线距离。
输入
输入文件中包含多个测试数据。每个测试数据占一行,表示海盗每次藏宝时的行走过程,格式如样例输入所示。最后一行为字符串"END",表示输入结束。
输出
对于输入文件中的每个测试数据,输出3行:第一行表示测试数据的序号;第二行为宝藏的位置;第三行表示宝藏离大树的距离。格式如样例输出所示。
样例输入
3N,1E,1N,3E,2S,1W.
10NW.
END
样例输出
Example #1
The treasure is located at (3.000,2.000).
The distance to the treasure is 3.606.
Example #2
The treasure is located at (-7.071,7.071).
The distance to the treasure is 10.000.
思路
东西方向上的移动用一个量计算,南北方向上的移动用一个量计算,如果是NE,就拆分成两个方向,移动的大小可根据三角形的就能算出
上代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
int main()
{
string s;
string s1="END";
double n,e,z;//n存储南北方向的移动,e存储东西方向的移动
int a[100000]={0};//存储每次移动的步数
int j=1;//样例代号1,2.....
while(getline(cin,s)) //输入一整串移动路线
{
double x=0; //存储步数
if(s==s1)break; //遇到END结束
z=0,n=0,e=0; // 对于每一组数据初始化为0
int l=s.size(); //移动路线的长度
int t=0; //存储每次移动步数的长度,见24行
for(int i=0;i<l;i++)
{
if(s[i]==','){
x=0; //遇到一个 ',' 初始化为0
memset(a,0,sizeof(a)); //同上
t=0; //同上
}
if(s[i]=='.')break; //结尾是'.'一组数据结束
else if(s[i]>='0'&&s[i]<='9')a[t++]=s[i]-'0'; //如果是数字,存储到整形数组里
else
{
for(int k=t-1;k>=0;k--) //从向前取出步数
x+=a[k]*pow(10,t-1-k); //转换为十进制数的步数
if(s[i]=='N'&&s[i+1]=='W')n+=sqrt(x*x/2),e-=sqrt(x*x/2),i++; //如果是NW,n加上,e减去,i++(关键一步)
else if(s[i]=='N'&&s[i+1]=='E')n+=sqrt(x*x/2),e+=sqrt(x*x/2),i++; //(因为是两个字符,例如NW,当前的i对于N,i加1后)
else if(s[i]=='S'&&s[i+1]=='E')n-=sqrt(x*x/2),e+=sqrt(x*x/2),i++; //(再次循环,两个字符就跳过去了)
else if(s[i]=='S'&&s[i+1]=='W')n-=sqrt(x*x/2),e-=sqrt(x*x/2),i++; //(不然,下面单字符的会再次用到NW中的W)
else if(s[i]=='N')n+=x; //对于单字符的处理,下同
else if(s[i]=='S')n-=x;
else if(s[i]=='E')e+=x;
else if(s[i]=='W')e-=x;
}
}
z=sqrt(n*n+e*e); //计算距离
cout<<"Example #"<<j++<<endl; //输出
printf("The treasure is located at (%.3lf,%.3lf).\n",e,n);
printf("The distance to the treasure is %.3lf.\n",z);
}
return 0;
}