Ακολουθεί μια γενίκευση του αλγόριθμου που έστειλα παραπάνω βασισμένη στην γενίκευση του αρχικού προβλήματος που έθεσε ο noname.
Η αρχική θέση και η επιθυμητή κατεύθυνση κίνησης λαμβάνεται υπόψιν μέσω της κατάλληλης ολίσθησης δεξιά ή αριστερά των πινάκων ii και jj.
Η υλοποίηση των ολισθήσεων θα μπορούσε ίσως να γίνει καλύτερη.
ΠΡΟΓΡΑΜΜΑ Billiard2
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: ii[8], jj[18], iibuf[8], jjbuf[18], n, m, i, j
ΑΚΕΡΑΙΕΣ: iimax, jjmax, i_init, j_init, i_next, j_next
ΑΚΕΡΑΙΕΣ: i_dir, j_dir, imax, jmax, step, i_shift, j_shift
ΑΡΧΗ
!---------------------------------------------------------------
! Αρχικοποιήσεις-εισαγωγή δεδομένων
! (προσοχή στις δεσμεύσεις μνήμης των ii, jj,
! πρέπει να είναι ίσες με iimax, jjmax)
!
! Αρχικοποίηση των πινάκων ii, jj σε:
! [1,2,3,4,5,4,3,2], [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2]
!---------------------------------------------------------------
imax <- 5
jmax <- 10
iimax <- 2*imax - 2
jjmax <- 2*jmax - 2
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ iimax
ΑΝ i <= imax ΤΟΤΕ
ii[i] <- i
ΑΛΛΙΩΣ
ii[i] <- 2*imax - i
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ jjmax
ΑΝ j <= jmax ΤΟΤΕ
jj[j] <- j
ΑΛΛΙΩΣ
jj[j] <- 2*jmax - j
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Αρχική γραμμή'
ΔΙΑΒΑΣΕ i_init
ΓΡΑΨΕ 'Αρχική στήλη'
ΔΙΑΒΑΣΕ j_init
ΓΡΑΨΕ 'Επόμενη γραμμή'
ΔΙΑΒΑΣΕ i_next
ΓΡΑΨΕ 'Επόμενη στήλη'
ΔΙΑΒΑΣΕ j_next
ΓΡΑΨΕ 'N'
ΔΙΑΒΑΣΕ n
ΓΡΑΨΕ
!---------------------------------------------------------------
!---------------------------------------------------------------
! Ολισθήσεις των πινάκων ii, jj για να λάβουμε υπ'οψιν την αρχική
! θέση και τις επιθυμητές κατευθύνσεις κίνησης
!---------------------------------------------------------------
i_dir <- i_next - i_init
j_dir <- j_next - j_init
i_shift <- i_init - 1
ΑΝ i_dir > 0 ΤΟΤΕ
! Ολίσθησε το ii[] αριστερά (i_init-1) φορές
ΓΙΑ i ΑΠΟ i_init ΜΕΧΡΙ iimax
iibuf[i - i_shift] <- ii[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ i_init - 1
iibuf[iimax - i_shift + i] <- ii[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ iimax
ii[i] <- iibuf[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ_ΑΝ i_dir < 0 ΤΟΤΕ
! Ολίσθησε το ii[] δεξιά (i_init-1) φορές
ΓΙΑ i ΑΠΟ i_shift + 1 ΜΕΧΡΙ iimax
iibuf[i] <- ii[i - i_shift]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ i_shift
iibuf[i] <- ii[iimax - i_shift + i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ iimax
ii[i] <- iibuf[i]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
! Εαν πρέπει να κινηθούμε κατά μήκος της γραμμής πρέπει το ii[]=i_init
ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ iimax
ii[i] <- i_init
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ
j_shift <- j_init - 1
ΑΝ j_dir > 0 ΤΟΤΕ
! Ολίσθησε το jj[] αριστερά (j_init-1) φορές
ΓΙΑ j ΑΠΟ j_init ΜΕΧΡΙ jjmax
jjbuf[j - j_shift] <- jj[j]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ j_init - 1
jjbuf[jjmax - j_shift + j] <- jj[j]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ jjmax
jj[j] <- jjbuf[j]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ_ΑΝ j_dir < 0 ΤΟΤΕ
! Ολίσθησε το jj[] δεξιά (j_init-1) φορές
ΓΙΑ j ΑΠΟ j_shift + 1 ΜΕΧΡΙ jjmax
jjbuf[j] <- jj[j - j_shift]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ j_shift
jjbuf[j] <- jj[jjmax - j_shift + j]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ jjmax
jj[j] <- jjbuf[j]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΛΛΙΩΣ
! Εαν πρέπει να κινηθούμε κατά μήκος της στήλης πρέπει το jj[]=j_init
ΓΙΑ j ΑΠΟ 1 ΜΕΧΡΙ jjmax
jj[j] <- j_init
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΑΝ
!---------------------------------------------------------------
!---------------------------------------------------------------
! Κυρίως αλγόριθμος
!---------------------------------------------------------------
ΓΙΑ step ΑΠΟ 1 ΜΕΧΡΙ n
m <- step - 1
i <- ii[m MOD iimax + 1]
j <- jj[m MOD jjmax + 1]
ΓΡΑΨΕ step, ' -> Α[', i, ',', j, ']'
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
!---------------------------------------------------------------
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ Billiard2