/*
這題要注意誤差,因為double會有誤差
Run time: 0.010
*/
#include <stdio.h>
#include <stdlib.h> // atoi(str) 要用
#include <string.h> // strlen(str), strcmp(str)要用
#include <ctype.h> // isdigit(ch) 判斷是否為數字用的
#include <math.h> // sqrt(2.0) 和 EPS 要用
#define EPS pow(10, -9) // 誤差要用的, double容易有誤差
#define sqrt2 sqrt(2.0)
char str[201];
int main()
{
int i;
int len;
double move;
double x, y;
int cnt = 0;
while (gets(str))
{
if (!strcmp(str, "END")) break;
len = strlen(str);
x = y = 0.0;
for (i = 0; i < len; i++)
{
move = atoi(str+i); // 取出數字
while (isdigit(str[i])) // 跳過數字到非數字
i++;
// N, E, S, W 四種方向其中之一
if (str[i+1] == ',' || str[i+1] == '.')
{
switch (str[i])
{
case 'N': y += move; break;
case 'E': x += move; break;
case 'S': y -= move; break;
case 'W': x -= move; break;
}
i++;
}
// NE, NW, SE, SW 四種方向其中之一
else
{
// 座標要取cos(PI/4), sin(PI/4)
move /= sqrt2;
switch (str[i])
{
case 'N':
x += (str[i+1] == 'E') ? move : -move;
y += move;
break;
case 'S':
x += (str[i+1] == 'E') ? move : -move;
y -= move; break;
}
i+=2;
}
}
printf("Map #%d\n", ++cnt);
printf("The treasure is located at (%.3lf,%.3lf).\n", EPS+x, EPS+y);
printf("The distance to the treasure is %.3lf.\n\n", EPS+sqrt(x*x+y*y));
}
}
2009年2月12日 星期四
Q587: There's treasure everywhere!
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言