首页 > ACM题库 > HDU-杭电 > Hdu 1472 There’s Treasure Everywhere![解题报告] C++
2013
12-11

Hdu 1472 There’s Treasure Everywhere![解题报告] C++

There’s Treasure Everywhere!

问题描述 :

Finding buried treasures is simple: all you need is a map! The pirates in the Caribbean were famous for their enormous buried treasures and their elaborate maps. The maps usually read like “Start at the lone palm tree. Take three steps towards the forest, then seventeen step towards the small spring, . . . blahblah . . . , finally six steps toward the giant rock. Dig right here, and you will find my treasure!” Most of these directions just boil down to taking the mentioned number of steps in one of the eight principal compass directions (depicted in the left of the figure).
Obviously, following the paths given by these maps may lead to an interesting tour of the local scenery, but if one is in a hurry, there is usually a much faster way: just march directly from your starting point to the place where the treasure is buried. Instead of taking three steps north, one step east, one step north, three steps east, two steps south and one step west (see figure), following the direct route (dashed line in figure) will result in a path of about 3.6 steps.

You are to write a program that computes the location of and distance to a buried treasure, given a `traditional’ map.

输入:

The input contains several strings, each one on a line by itself, and each one consisting of at most 200 characters. The last string will be END, signaling the end of the input. All other strings describe one treasure map each, according to the following format:

The description is a comma-separated list of pairs of lengths (positive integers less than 1000) and directions (N (north), NE (northeast), E (east), SE (southeast), S (south), SW (southwest), W (west) or NW (northwest)). For example, 3W means 3 steps to the west, and 17NE means 17 steps to the northeast. A full stop (.) terminates the description, which contains no blanks.

输出:

For every map description in the input, first print the number of the map, as shown in the sample output. Then print the absolute coordinates of the treasure, in the format “The treasure is located at (x,y).”. The coordinate system is oriented such that the x-axis points east, and the y-axis points north. The path always starts at the origin (0,0).

On the next line print the distance to that position from the point (0,0), in the format “The distance to the treasure is d.”. The fractional values x, y, d must be printed exact to three digits to the right of the decimal point.

Print a blank line after each test case.

样例输入:

3N,1E,1N,3E,2S,1W.
10NW.
END

样例输出:

Map #1
The treasure is located at (3.000,2.000).
The distance to the treasure is 3.606.

Map #2
The treasure is located at (-7.071,7.071).
The distance to the treasure is 10.000.


题目大意:给定一段字符串,按方向移动,每一步长度为1,找出终点的坐标和计算终点与原点的距离(N,E,W,S,NW….均为方向)。
题目思路:主要是处理字符串和注意cos(45)的精度.
实现代码:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
	char a[250],num[10];
	int i,j,len,k,temp,t=0;
	double x,y,dis;
	while(cin>>a)
	{
		t++;
		len=strlen(a);
		if(a[0]=='E'&&a[1]=='N'&&a[2]=='D')//输入END结束。
			break;
		k=0;
		x=y=0;
		for(i=0;i<len;i++)
		{
			if(a[i]>='0'&&a[i]<='9')//处理方向前的数字,先存入一个数组中。
			{
				num[k++]=a[i];
			}
			else if(a[i]==','||a[i]=='.')//若遇到分隔符,代表一个方向结束,此时开始计算这一步走了多远,并记录坐标。
			{
				temp=num[0]-48;
				for(j=1;j<k;j++)//将字符串形式的数字改变为整型。
				{
					temp=temp*10+num[j]-48;
				}
				double s=temp*sqrt(2.0)/2.0;//斜着移动时x,y增加的距离为长度乘以cos45.
				if(a[i-1]=='N'&&( a[i-2]<='9'&&a[i-2]>='0') )//对应各自方向进行计算移动后坐标。
					y+=temp;
				else if(a[i-1]=='E'&&( a[i-2]<='9'&&a[i-2]>='0') )
					x+=temp;
				else if(a[i-1]=='W'&&( a[i-2]<='9'&&a[i-2]>='0') )
					x-=temp;
				else if(a[i-1]=='S'&&( a[i-2]<='9'&&a[i-2]>='0') )
					y-=temp;
				else if(a[i-1]=='E'&&a[i-2]=='N' )
				{
					x+=s;
					y+=s;
				}
				else if(a[i-1]=='E'&&a[i-2]=='S' )
				{
					x+=s;
					y-=s;
				}
				else if(a[i-1]=='W'&&a[i-2]=='S' )
				{
					x-=s;
					y-=s;
				}
				else if(a[i-1]=='W'&&a[i-2]=='N' )
				{
					x-=s;
					y+=s;
				}
				k=0;
			}
		}
		dis=sqrt(x*x+y*y);//计算距离。
		printf("Map #%d\n",t);
		printf("The treasure is located at (%.3lf,%.3lf).\n",x,y);
		printf("The distance to the treasure is %.3lf.\n\n",dis);

	}
	return 0;
}