My ugly solution in C , after hours unfortunately :(
#include <stdio.h> #include <stdlib.h> #define START_C 0 #define START_R 0 typedef struct _dist_point_min{ int dist_min; int row_min; int col_min; }dist_point_min; void calc_dist(int row, int col, dist_point_min *str); int main(int argc, char *argv[]){ FILE* fd; int i; char buf; int pos; fd = fopen("input.txt","r"); if (fd == NULL){ perror("Errore apertura file"); exit(1); } i = 0; while((fscanf(fd, "%c,", &buf)) > 0 && buf != '\n' ){ } while(fscanf(fd, "%c,", &buf) > 0 && fscanf(fd, "%d,", &pos) > 0){ //printf("p: %d\n", pos); i++; } //printf("i: %d\n",i); int NUM_ELEM = i+1; dist_point_min min_dist = {100000000, START_C, START_R}; int x[NUM_ELEM]; x[0] = START_R; int y[NUM_ELEM]; y[0] = START_C; int x1[NUM_ELEM]; x1[0] = START_R; int y1[NUM_ELEM]; y1[0] = START_C; int curr_row = START_R; int curr_col = START_C; fd = fopen("input.txt","r"); if (fd == NULL){ perror("Errore apertura file"); exit(1); } i = 1; while((fscanf(fd, "%c,", &buf)) > 0 && buf != '\n' ){ switch(buf){ case 'R': fscanf(fd, "%d,", &pos); x[i] = curr_row; y[i] = curr_col + pos; printf("R r: %d, c: %d \n", x[i], y[i]); curr_col += pos; break; case 'L': fscanf(fd, "%d,", &pos); x[i] = curr_row; y[i] = curr_col - pos; printf("L r: %d, c: %d \n", x[i], y[i]); curr_col -= pos; break; case 'U': fscanf(fd, "%d,", &pos); x[i] = curr_row - pos; y[i] = curr_col; printf("U r: %d, c: %d \n", x[i], y[i]); curr_row -= pos; break; case 'D': fscanf(fd, "%d,", &pos); x[i] = curr_row + pos; y[i] = curr_col; printf("D r: %d, c: %d \n", x[i], y[i]); curr_row += pos; break; } i++; } /*for(int c = 0; c < 5; c++){ printf("r: %d, c: %d \n",x[c],y[c]); }*/ curr_row = START_R; curr_col = START_C; i = 1; printf("\n"); while((fscanf(fd, "%c,", &buf)) > 0){ switch(buf){ case 'R': fscanf(fd, "%d,", &pos); x1[i] = curr_row; y1[i] = curr_col + pos; for(int r = 1; r <= NUM_ELEM; r++){ // printf("\n y[r]: %d, y1[i-1]: %d, y1[i]: %d\n",y[r],y1[i-1],y1[i]); if(x1[i] <= x[r-1] && x1[i] >= x[r] || x1[i] >= x[r-1] && x1[i] <= x[r]){ // printf("S4\n"); if(y1[i-1] <= y[r] && y1[i] >= y[r] || y1[i-1] >= y[r] && y1[i] <= y[r]){ // printf("S4_2\n"); // printf("\nVEDI: x: %d, y1: %d\n\n",x1[i],y[r]); calc_dist(x1[i],y[r],&min_dist); } } } printf("R r: %d, c: %d \n", x1[i], y1[i]); curr_col += pos; break; case 'L': //* fscanf(fd, "%d,", &pos); x1[i] = curr_row; y1[i] = curr_col - pos; for(int r = 1; r <= NUM_ELEM; r++){ // printf("\n y[r]: %d, y1[i-1]: %d, y1[i]: %d\n",y[r],y1[i-1],y1[i]); if(x1[i] <= x[r-1] && x1[i] >= x[r] || x1[i] >= x[r-1] && x1[i] <= x[r]){ // printf("S4\n"); if(y1[i-1] <= y[r] && y1[i] >= y[r] || y1[i-1] >= y[r] && y1[i] <= y[r]){ // printf("S4_2\n"); // printf("\nVEDI: x: %d, y1: %d\n\n",x1[i],y[r]); calc_dist(x1[i],y[r],&min_dist); } } } printf("L r: %d, c: %d \n", x1[i], y1[i]); curr_col -= pos; break; case 'U': fscanf(fd, "%d,", &pos); x1[i] = curr_row - pos; y1[i] = curr_col; for(int r = 1; r <= NUM_ELEM; r++){ // printf("\n y[r-1]: %d, y[r]: %d, y1[i]: %d\n",y[r-1],y[r],y1[i]); if(y1[i] <= y[r-1] && y1[i] >= y[r] || y1[i] >= y[r-1] && y1[i] <= y[r]){ // printf("S4\n"); if(x1[i-1] <= x[r] && x1[i] >= x[r] || x1[i-1] >= x[r] && x1[i] <= x[r]){ // printf("S4_2\n"); // printf("\nVEDI: x1: %d, y: %d\n\n",x[r],y1[i]); calc_dist(x[r],y1[i],&min_dist); } } } printf("U r: %d, c: %d \n", x1[i], y1[i]); curr_row -= pos; break; case 'D': //* fscanf(fd, "%d,", &pos); x1[i] = curr_row + pos; y1[i] = curr_col; for(int r = 1; r <= NUM_ELEM; r++){ // printf("\n y[r-1]: %d, y[r]: %d, y1[i]: %d\n",y[r-1],y[r],y1[i]); if(y1[i] <= y[r-1] && y1[i] >= y[r] || y1[i] >= y[r-1] && y1[i] <= y[r]){ //printf("S4\n"); if(x1[i-1] <= x[r] && x1[i] >= x[r] || x1[i-1] >= x[r] && x1[i] <= x[r]){ // printf("S4_2\n"); printf("\nVEDI: x1: %d, y: %d, pos %d\n\n",x[r],x1[i-1],curr_row+pos); calc_dist(x[r],y1[i],&min_dist); } } } printf("D r: %d, c: %d \n", x1[i], y1[i]); curr_row += pos; break; } i++; } printf("%d\n", min_dist.dist_min); } void calc_dist(int row, int col, dist_point_min *min){ if(row == START_R && col == START_C) return; printf("-r: %d,c: %d\n\n", row,col); int d_col = 0; int d_row = 0; if(col > START_C) d_col = col - START_C; else d_col = START_C - col; if(row > START_R) d_row = row - START_R; else d_row = START_R - row; printf("+c: %d, r: %d\n",d_col,d_row); int dist = d_row + d_col; printf("dist %d\n",dist); if(min -> dist_min > dist){ min -> dist_min = dist; min -> row_min = row; min -> col_min = col; } }
Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink.
Hide child comments as well
Confirm
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
My ugly solution in C , after hours unfortunately :(