leomaster

EPY Dimokritos - 2004 Phase B, refactor of https://pastebin.com/jsnVFFCW

Oct 23rd, 2020 (edited)
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.13 KB | None | 0 0
  1. /*
  2. this is a refactored solution of https://pastebin.com/jsnVFFCW
  3.  
  4. 17ος Πανελλήνιος Διαγωνισμός Πληροφορικής
  5. (Σχολικό Έτος 2004-5)
  6.  
  7. Θέμα Β' Φάσης: Δημόκριτος
  8. Το Εθνικό Κέντρο Έρευνας Φυσικών Επιστημών "Δημόκριτος" της Ελλάδος, ονομάστηκε έτσι προς τιμή του Έλληνα «πατέρα» της ατομικής θεωρίας Δημόκριτου. Το Ε.Κ.Ε.Φ.Ε. διαθέτει πολλά Ερευνητικά Ινστιτούτα με περισσότερο ίσως γνωστό, το Ινστιτούτο Πυρηνικών Ερευνών. Μια από τις πολλές δραστηριότητες αυτού του Ινστιτούτου, είναι η παραγωγή ραδιενεργών σκευασμάτων που χρησιμοποιούνται για θεραπευτικούς, ερευνητικούς και παραγωγικούς σκοπούς. (π.χ. Ραδιοθεραπείες, Ισοτοπική Επισήμανση, Βιομηχανικές Ακτινογραφίες).
  9.  
  10. Τα ραδιενεργά σκευάσματα, τοποθετούνται σε ειδικά κιβώτια που δεν επιτρέπουν την εκπομπή ακτινοβολίας μέσα από αυτά. Κάθε κιβώτιο είναι εφοδιασμένο με συσκευή εκπομπής αναγνωριστικού σήματος (ραδιοταυτότητα). Τα κιβώτια αποθηκεύονται σε συγκεκριμένες θέσεις μιας επίπεδης αποθήκης. Μεταξύ των θέσεων αποθήκευσης, σχηματίζεται ένα κανονικό τετραγωνικό πλέγμα από διαδρόμους μετακίνησης. Ο κάθε κόμβος (διασταύρωση) των διαδρόμων μετακίνησης, προσδιορίζεται από ζεύγος συντεταγμένων (x, y). Στην οροφή της αποθήκης και στις «διασταυρώσεις» αυτού του πλέγματος, είναι τοποθετημένοι αισθητήρες υπερβραχέων, με σκοπό την αναγνώριση της θέσης των κιβωτίων. Ο κάθε αισθητήρας έχει συντεταγμένες (x, y) και ένα μοναδικό κωδικό αριθμό, που απεικονίζεται στο σύστημα ελέγχου. Αν ένα κιβώτιο βρεθεί σε μία διασταύρωση (κόμβο), τότε γίνεται αντιληπτό από το αισθητήρα που βρίσκεται ακριβώς πάνω από τον κόμβο και από τους οκτώ πλησιέστερους αισθητήρες προς το συγκεκριμένο κόμβο. Για παράδειγμα ένα κιβώτιο που θα περάσει από τη θέση (0, 0) γίνεται αντιληπτό από τους αισθητήρες: (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1) και τον (0, 0).
  11.  
  12. Τα κιβώτια μετακινούνται εντός της αποθήκης, με τη βοήθεια αυτόματου ρομποτικού οχήματος μεταφοράς. Προφανώς το ρομπότ μπορεί να μετακινείται στους διαδρόμους μεταξύ των κιβωτίων, κινούμενο πάντοτε παράλληλα ή κάθετα στον άξονα των x. Το ρομπότ ευρισκόμενο σε κάποιο κόμβο, μπορεί να κάνει μια από τις τέσσερις κινήσεις (Up), (Down), (Right), (Left). Κάθε κίνηση R αυξάνει τη τιμή της συντεταγμένης x (τετμημένη) κατά 1. Κάθε κίνηση U αυξάνει τη τιμή της συντεταγμένης y (τεταγμένη) κατά 1. Ως αρχή των κινήσεων του ρομποτικού συστήματος μεταφοράς, νοείται πάντοτε η αρχή των αξόνων (0,0). Στο επόμενο σχήμα, δίνεται ένα απλοποιημένο διάγραμμα διαδρομών με (11 x 11) διασταυρώσεις.
  13.  
  14. Να αναπτύξετε ένα πρόγραμμα το οποίο θα λαμβάνει σαν είσοδο τις κινήσεις των κιβωτίων και θα παράγει σαν έξοδο:
  15.  
  16. Α) Mε αύξουσα σειρά, τους κωδικούς αριθμούς των αισθητήρων που αναγνώρισαν τα κιβώτια.
  17. Β) Τον αριθμό των διεγέρσεων που δέχθηκε κάθε αισθητήρας.
  18. image
  19.  
  20. ΕΙΣΟΔΟΣ
  21. Στην πρώτη γραμμή του αρχείου εισόδου dimokritos.in δίνεται ένας ακέραιος αριθμός N, (όπου 1 < N < 2,000,000), που αντιπροσωπεύει το πλήθος των αισθητήρων. Σε κάθε μία από τις ακόλουθες N γραμμές δίνονται οι συντεταγμένες των αισθητήρων με δύο ακέραιους αριθμούς, Χ και Υ που χωρίζονται με κενό χαρακτήρα, ( όπου -700 < x, y < 700). Η σειρά εμφάνισης των αισθητήρων ταυτίζεται με τον αντίστοιχο κωδικό αριθμό τους.
  22.  
  23. Στην επόμενη, (N+1)οστή γραμμή, δίνεται ο ακέραιος αριθμός Κ, (όπου 0 <= Κ <= 2,000,000) που δηλώνει το πλήθος των κινήσεων που πραγματοποίησε το ρομποτικό όχημα. Η τελευταία γραμμή περιέχει τους Κ χαρακτήρες που μας εμφανίζουν τη διαδρομή που πραγματοποίησε το όχημα. Οι χαρακτήρες αυτοί μπορεί να είναι U, D, R, L (Κεφαλαία Λατινικά) χωρίς κενό μεταξύ τους. Κάθε γραμμή συμπεριλαμβανομένης της τελευταίας τερματίζεται με τον χαρακτήρα νέας γραμμής και κανένας άλλος χαρακτήρας δεν υπάρχει μετά τον τελευταίο αριθμό κάθε γραμμής.
  24.  
  25. Σε κάθε περίπτωση το αρχείο εισόδου δεν μπορεί να ξεπερνά τα 2ΜΒ.
  26.  
  27. ΕΞΟΔΟΣ
  28. Στο αρχείο εξόδου dimokritos.out θα πρέπει να γράψετε τους αριθμούς των αισθητήρων που έχουν «αντιληφθεί» το ρομποτικό όχημα καθώς και τον αριθμό (πλήθος) ων διεγέρσεων που έχει δεχτεί. Οι αριθμοί των αισθητήρων πρέπει να είναι ταξινομημένοι σε αύξουσα σειρά και κάθε αισθητήρας πρέπει να είναι σε με μια χωριστή γραμμή. Ο αριθμός των διεγέρσεων θα ξεχωρίζει με ένα κενό. Εάν κανένας αισθητήρας δεν «αντιλήφθηκε» το όχημα, στη πρώτη και μόνη γραμμή του αρχείου εξόδου πρέπει να γράψετε "-1".
  29.  
  30. (Παρατήρηση: Θεωρούμε ότι η παρακολούθηση κάθε μετακινούμενου κιβωτίου ξεκινάει όταν αυτό βρεθεί στην αρχή των αξόνων. Επίσης: Από τη στιγμή που κινηθεί το ρομποτικό όχημα μεταφοράς, ενεργοποιούνται και οι 9 αισθητήρες, γύρω και πάνω από την αρχή των αξόνων).
  31.  
  32. ΠΑΡΑΔΕΙΓΜΑΤΑ:
  33. dimokritos.in
  34. 15
  35. 0 0
  36. -1 0
  37. -1 1
  38. 0 1
  39. 1 1
  40. 1 0
  41. 1 -1
  42. 0 -1
  43. -1 -1
  44. 2 0
  45. 2 -1
  46. 2 1
  47. -1 2
  48. 0 2
  49. 1 2
  50. 1
  51. R
  52.  
  53. dimokritos.out
  54. 1 2
  55. 2 1
  56. 3 1
  57. 4 2
  58. 5 2
  59. 6 2
  60. 7 2
  61. 8 2
  62. 9 1
  63. 10 1
  64. 11 1
  65. 12 1
  66.  
  67. dimokritos.in  
  68. 25
  69. -2 -2
  70. -2 -1
  71. -2 0
  72. -2 1
  73. -2 2
  74. -1 2
  75. 0 2
  76. 1 2
  77. 2 2
  78. 2 1
  79. 2 0
  80. 2 -1
  81. 2 -2
  82. 1 -2
  83. 0 -2
  84. -1 -2
  85. -1 0
  86. -1 1
  87. 0 1
  88. 1 1
  89. 1 0
  90. 1 -1
  91. 0 -1
  92. -1 -1
  93. 0 0
  94. 0
  95.  
  96. dimokritos.out
  97. -1
  98.  
  99. */
  100.  
  101. #include <stdio.h>
  102. #include <stdlib.h>
  103.  
  104. #ifndef DIMOKRITOS
  105. #define DIMOKRITOS
  106.  
  107. #define ZERO 0
  108. #define NOMOVES "-1\n"
  109. #define MEAN 700
  110. #define MAX 1400
  111. #define PENTIUM 86
  112. #define NEGATIVE_MONAD "-1\n"
  113.  
  114. #define UNSIGNED "%u\n"
  115.  
  116. #define NUMBER "%d"
  117. #define NUMBER_LF "%d\n"
  118. #define NUMBERS "%d %d\n"
  119.  
  120. #define READ "r"
  121. #define WRITE "w"
  122.  
  123. #define UP 'U'
  124. #define DOWN 'D'
  125. #define LEFT 'L'
  126. #define RIGHT 'R'
  127.  
  128. #define IN "dimokritos.in"
  129. #define OUT "dimokritos.out"
  130. #endif
  131.  
  132. int x , y , *Xs , *Ys , gps [ MAX ][ MAX ] , grid ;
  133. unsigned int id , sensors , moves ;
  134. FILE *stream ;
  135.  
  136. int Up() {
  137.     y++ ;
  138. }
  139.  
  140. int Down() {
  141.     y-- ;
  142. }
  143.  
  144. int Left() {
  145.     x-- ;
  146. }
  147.  
  148. int Right() {
  149.     x++ ;
  150. }
  151.  
  152. void act_sensors () {
  153.     ++gps[~-x][~-y], ++gps[  x][y], ++gps[-~x][-~y] ;
  154.     ++gps[  x][~-y], ++gps[-~x][y], ++gps[~-x][-~y] ;
  155.     ++gps[-~x][~-y], ++gps[~-x][y], ++gps[  x][-~y] ;
  156. }
  157.  
  158. typedef int (*fptr)() ;
  159.  
  160. fptr fn_move[PENTIUM] ;
  161.  
  162. int main ( int argc, char *argv[] ) {
  163.  
  164.     fscanf ( stream = fopen ( IN , READ ) , UNSIGNED , &sensors ) ;
  165.     Xs = ( int * ) malloc ( sensors * sizeof( int ) ) ;
  166.     Ys = ( int * ) malloc ( sensors * sizeof( int ) ) ;
  167.     for ( id = ZERO ; id < sensors ; ++id )
  168.         fscanf ( stream , NUMBERS , &Xs[id] , &Ys[id] ) ;
  169.        
  170.     x = y = MEAN ;
  171.     fn_move[UP] = Up, fn_move[DOWN] = Down, fn_move[LEFT] = Left, fn_move[RIGHT] = Right ;
  172.     fscanf ( stream , UNSIGNED , &moves ) ;
  173.  
  174.     for ( act_sensors(), id = ZERO ; id < moves ; ++id ) {
  175.         fn_move [ getc ( stream ) ] () ;
  176.         act_sensors ();
  177.     }
  178.     fclose ( stream ) ;
  179.  
  180.     stream = fopen ( OUT , WRITE ) ;
  181.     if ( moves > ZERO ) {
  182.         for ( id = ZERO ; id < sensors ; ++id )
  183.             if ( ( grid = gps[Xs[id] + MEAN][Ys[id] + MEAN] ) > ZERO )
  184.                 fprintf ( stream , NUMBERS , -~id , grid ) ;
  185.     } else {
  186.         fputs ( NOMOVES , stream ) ;
  187.     }
  188.     free ( Xs ), free ( Ys ) ;
  189.     fclose ( stream ) ;
  190.  
  191.     return ZERO;
  192. }
Add Comment
Please, Sign In to add comment