Αρχικά και εγώ πήγα να το κάνω με ένα τρόπο αντίστοιχο με τον δικό σου, αλλά προέκυπταν πολλές περιπτώσεις και είπα να βρω κάτι πιο σύντομο. Κάτι μου έλεγε μέσα μου όμως πως δε θα τη γλιτώσω τελικά και θα το κάνω και με τον άλλο τρόπο

Λοιπόν... οι περιπτώσεις δεν είναι μόνο 4 (δηλαδή να βρεθείς σε έναν από τους 4 «τοίχους») αλλά περισσότερες. Δες για παράδειγμα τον πάνω τοίχο. Μετά τον αριθμό 2 πάς κάτω και αριστερά, αλλά μετά τον αριθμό 6 πάς δίπλα. Και τις 2 φορές είσαι στον πάνω τοίχο αλλά το επόμενο βήμα αλλάζει.
Όλες αυτές οι διαφορετικές περιπτώσεις πρέπει να διακριθούν.
Αυτό που είναι ενδιαφέρον είναι ότι αν πας με το χέρι σου να κάνεις τη σάρωση ζιγκ ζαγκ είναι πολύ εύκολο. Αυτό εμένα μου λέει ότι μέσα στο κεφάλι μας είναι καρφωμένος ένα αλγόριθμος. Θα πρέπει να ψάξουμε μέσα μας να δούμε τι ακριβώς κάνουμε υποσυνείδητα και να το εκφράσουμε... σε ψευδογλώσσα.
Ουσιαστικά αν πας προς μια κατεύθυνση συνεχίζεις να πηγαίνεις μέχρι να «σκάσεις» πάνω στον τοίχο. Το ότι συνεχίζεις να κάνεις αυτό που έκανες και πριν μου λέει ότι κατά κάποιο τρόπο στο πρόβλημα υπάρχει κάποιου είδους «μνήμη». Σκέψου ότι αν σε ρωτήσω ποιο είναι το επόμενο βήμα από τη θέση α[17,16] σε ένα πίνακα α[30,30] δεν θα ξέρεις κατευθείαν. Θα πρέπει να πας από την αρχή για να δεις την πορεία πριν τη θέση α[17,16]. Αν ξέρεις τα προηγούμενα μετά απλά θα συνεχίσεις. Αυτό μου δίνει την ιδέα να κρατάω τις προηγούμενες τιμές των δεικτών. Δηλαδή θα έχω τα i και j της τρέχουσς θέσης αλλά θα κρατάω και τις αμέσως προηγούμενες τιμές τους. Δηλαδή θα έχω προηγούμενο_i και προηγούμενο_j. Ισως έτσι να μπορέσω να εκφράσω με φυσικό τρόπο το πρόβλημα. Πρόσεξε ότι αν πάνω σε ένα σχήμα πίνακα 2 διαστάσεων σου δώσω την τρέχουσα και την προηγούμενη θέση (χωρίς να σου δώσω όλη τη διαδρομή) τότε μπορείς να καταλάβεις πως θα συνεχίσεις. Μάλλον πιάσαμε την άκρη του νήματος
Παρατήρησε τώρα πως διαφοροποιουται οι παραπάνω περιπτώσεις του αριθμού 2 και του αριθμού 6. Και στις 2 περιπτώσεις είμαι στον πάνω τοίχο. Αλλά πριν το 2 ήμουν δίπλα αριστερά ενώ πριν το 6 ήμουν κάτω αριστερά. Να η διαφορά που θα με κάνει να διακρίνω τις περιπτώσεις και άρα να καθορίσω το επόμενο βήμα. Το «δίπλα αριστερά» και το «κάτω αριστερά» εκφράζονται πολύ εύκολα σαν σχέσεις των δεικτών i και j αλλά και των προηγούμενο_i και προηγούμενο_j. Άρα πάμε καλά. Θέλουμε 2 συνθήκες για τον πάνω τοίχο.
Ανάλογο σκεπτικό εφαρμόζεις και για τους 4 τοίχους. Μετά ελέγχεις τι ακριβώς γίνεται στις γωνίες. Και τέλος βλέπεις τι ακριβώς γίνεται στη μέση.
Δεν τσέκαρα με ακρίβεια όλες τις περιπρώσεις, αλλά χοντρικά από ότι βλέπω με το μάτι θέλεις 2 ελέγχους για κάθε τοίχο και κάθε γωνία. ʼρα 16 συνθήκες. Βάλε και άλλες 2 για τη μέση (μια όταν ανεβαίνεις και μια όταν κατεβαίνεις) πάμε στις 18. Ξαναλέω ότι δεν έκατσα να το ψάξω ακριβώς. Μπορεί να αλλάζει κάτι όταν ελέγξεις τις λεπτομέρειες.
Μετά θέλω κάποιο τρόπο να κάνω πιο συμπαγή των κώδικα. Παρατηρώ λοιπόν ότι όλες οι κινήσεις που γίνονται είναι δίπλα δεξιά, κάτω, κάτω αριστερά και πάνω δεξιά. ʼρα μια καλή ιδέα είναι να μαζέψω σε μια σύνθετη συνθήκη (με τη βοήθεια του λογικού τελεστή «Ή» όλες τις συνθήκες που οδηγούν σε κάθε μια από τις 4 κινήσεις. Έτσι τελικά θα έχω μια πολλαπλή επιλογή με 4 συνθήκες μόνο που η κάθε μια από αυτές θα είναι σύνθετη. Αν θέλω να ζουλήξω τα πράγματα ακόμα πιο πολύ μπορώ να βάλω λογικές μεταβλητές που θα υλοποιούν τις σύνθετες συνθήκες και απλά να ελέγχω στην τεσσάρα πολλαπλή επιλογή αν η λογική μεταβλητή είναι Αληθής ή Ψευδής και ανάλογα να αλλάζω τους 4 δείκτες.
Ακόμα μεγαλύτερη συμπίεση μπορώ να πετύχω αν φτιάξω διαδικασίες που αναλαμβάνουν την αλλαγή των δεικτών. Έτσι η πολλαπλη επιλογή θα έχει 4 απλές συνθήκες και η κάθε μια τους θα οδηγεί σε μια κλήση υποπργράμματος.
Αυτή είναι η κωδικοποίηση του προβλήματος που σκέφτηκα εγώ. Μπορεί να υπάρχουν και άλλες (πχ που να στηρίζονται στο άθροισμα των δεικτών αν είνα μονό ή ζυγό όπως η προηγούμενη προσέγγιση που ανέφερα). Μπορεί να υπάρχουν και πιο συμπαγείς λύσεις. Ψάξιμο θέλει.
Δεν έγραψα κώδικα αλλά σου ανέφερα τον τρόπο σκέψης έτσι ώστε να μπορέσεις μόνος σου να το ψάξεις. Είναι σίγουρα πιο παιδαγωγικό να δεις το τρόπο σκέψης παρά μια λύση που δε θα ξέρεις πως τη σκέφτηκα. Δες το και αν θέλεις κάτι τα ξαναλέμε.
Τώρα στα υπόλοιπα.
Η συνάρτηση δεν επιστρέφει και τις παραμέρους της. Αυτό είναι ξεκάθαρο. Η διαδικασία επιστρέφει τις πααμέτρους της (copy in copy out). Η συνάρτηση επιστρέφει μόνο μια τιμή με το όνομάτης. Αυτός είναι ο μόνος τρόπος να πάρεις πληροφορία από συνάρτηση. Αν η συνάρτηση επέστρεφε και τις παραμέτρους της τότε δε θα υπήρχε λόγος να υπάρχουν οι διαδικασίες. Θα τα κάναμε όλα με συναρτήσεις αφού οι λειτουργίες τους θα ήταν υπερσύνολο των λειτουργιών των διαδικασιών. (Εννοώ όχι μόνο ως προς το περιεχόμενο αλλά και ως προς το τρόπο κλησης).
Τέλος ...(το πιο σημαντικό)... για μένα το μάθημα δεν είναι πολύ απλό στα πλαίσια του λυκείου. Υπάρχουν ασκήσεις στο τετράδιο μαθητή (με 2 και 3 αστέρια) που είναι πολύ καλές. Για παράδειγμα η ανάλυση ενός αριθμού σε πρώτους παράγοντες ή το να βρεις πιο από τα στοιχεία ενός πίνακα εμφανίζεται πιο πολλές φορές κλπ είναι ασκήσεις μέσα από το διδακτικό μας πακέτο. Εύκολα είναι αυτά που πέφτουν μέχρι στιγμής στις εξετάσεις. Και έτσι όσοι διδάσκουν μόνο ΣΟΣ μένουν στα απλά. Όταν διδάσκεται με πληρότητα το διδακτικό πακέτο το μάθημα δεν είναι απλό. Έχει δυσκολία ανάλογη με τα μαθηματικά και τη φυσική και δεν τυποποιείται σε καμία περίπτωση. Όμως το πόσο δύσκολο είναι το μάθημα καθορίζεται από το διδακτικό πακέτο και όχι από τα ΣΟΣ. Ελπίζω πως το επίπεδο των πανελληνίων θα ανέβει και θα φέρει το μάθημα στην πραγματική του θέση εκθέτοντας όσους διδάσκουν μόνο τα ΣΟΣ.