2009年2月12日 星期四

Q587: There's treasure everywhere!

/*
這題要注意誤差,因為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));
}

}

沒有留言: