#include #include #include #include #define SM_N 8 #define SM_NE 12 #define SM_E 4 #define SM_SE 6 #define SM_S 2 #define SM_SW 3 #define SM_W 1 #define SM_NW 9 char *getone(char *in,char *out) { int i; //printf("in:%s\n",in); fflush(stdout); for(i = 0; i < strlen(in);i++) { if( in[i] == ',' || in[i] == '.') { // printf("i:%d\n",i); fflush(stdout); strncpy(out,in,(i)); out[i] = '\0'; return (in+i+1); } } return NULL; } void gettwo(char *in,int *d,int *sm) { int i,first=0; char tmp[128]; *sm = 0; for(i = 0; i < strlen(in); i++) { if( in[i] < '0' || in[i] > '9' ) { if( !first) { strncpy(tmp,in,i); tmp[i] = 0; *d = atoi(tmp); first= 1; } switch(in[i]) { case 'N': *sm = *sm | SM_N; break; case 'E': *sm = *sm | SM_E; break; case 'S': *sm = *sm | SM_S; break; case 'W': *sm = *sm | SM_W; break; } } } //printf("sm:%d %d\n",*sm,*d); } int main(void) { char line[1024],*n,*t,o[255]; double fin_x = 0.0f,fin_y = 0.0f; double half = sqrt(0.5f); int dd,sm; while(fgets(line,1023,stdin)) { line[strlen(line)] = '\0'; if( !strncmp(line,"END",3) ) break; //printf("in:%s",line); t = line; while(1) { n = getone(t,o); //printf("t:[%s] o:[%s] n:[%s]\n",t,o,n); if( n == NULL ) break; t = n; gettwo(o,&dd,&sm); switch(sm) { case SM_N: fin_y += (double)dd; break; case SM_NE: fin_x += (double)dd * half; fin_y += (double)dd * half; break; case SM_E: fin_x += (double)dd; break; case SM_SE: fin_x += (double)dd * half; fin_y -= (double)dd * half; break; case SM_S: fin_y -= (double)dd; break; case SM_SW: fin_x -= (double)dd * half; fin_y -= (double)dd * half; break; case SM_W: fin_x -= (double)dd; break; case SM_NW: fin_x -= (double)dd * half; fin_y += (double)dd * half; break; } } printf("You can go to (%.3f,%.3f), the distance is %.3f steps.\n", fin_x,fin_y,sqrt(fin_x*fin_x + fin_y*fin_y) ); fin_x=fin_y=0.0f; } return 0; }