Άσκηση γεμισματος πίνακα σε σπιράλ μορφή!!

Ξεκίνησε από Vagnes, 08 Φεβ 2013, 10:57:32 ΜΜ

« προηγούμενο - επόμενο »

Vagnes

Καλησπέρα σ' όλους.. Πώς σας φαινεται η άσκηση να γεμίσουμε ένα πίνακα 4χ4 με τους αριθμούς απο 1-16, σε σπιράλ μορφή( το 1 στο[1,1], το 2 στο [1,2] κ.ο.κ)???

        1     2    3    4
        12  13  14   5
        11  16  15   6
        10    9    8   7

noname

Εγώ το σκέφτηκα κάπως έτσι: Το σπιράλ είναι 4 διαφορετικές σαρώσεις (2 οριζόντιες και 2 κατακόρυφες εναλλάξ) με διαφορετικές αρχικές και τελικές τιμές και βήμα.
Δηλαδή, πρώτα σαρώνεις οριζόντια την 1η γραμμή από 1 μέχρι Ν με βήμα 1, έπειτα την Ν στήλη από 2 μέχρι Ν με βήμα 1, έπειτα την Ν γραμμή από Ν-1 μέχρι 1 με βήμα -1 έπειτα την 1η στήλη από Ν-1 μέχρι 2 με βήμα -1 κ.ο.κ. Το θέμα είναι να βρεις το πώς μεταβάλλονται οι αρχικές, οι τελικές τιμές και το βήμα κάθε σάρωσης.
Όλες αυτές οι σαρώσεις θα επαναλαμβάνονται μέχρι να προστεθούν Ν^2 αριθμοί.
Ο αλγόριθμος που έφτιαξα ίσως να είναι λίγο πολύπλοκος αλλά δουλεύει. Μάλλον θα υπάρχει κάτι πολύ πιο απλό αλλά τέτοια ώρα δεν δουλεύει και πολύ το μυαλό. :-)

αλγόριθμος σπιραλ
ν <- 4
για ι από 1 μέχρι ν
  α[1,ι]<- ι
Τέλος_επανάληψης
αγρ <- 2
αστ <- ν-1
τγρ <- ν
τστ <- 1
Χ <- ν + 1
στ <- ν 
Όσο Χ<=ν^2 επανάλαβε
	Για γρ από αγρ μέχρι τγρ
		α[γρ,στ] <- Χ
		Χ <- Χ + 1
	Τέλος_επανάληψης
	γρ <- τγρ
	τγρ <-  αγρ 
	αγρ <- γρ - 1
	Για στ από αστ μέχρι τστ με_βήμα -1
		α[γρ,στ] <- Χ
		Χ <- Χ + 1
	Τέλος_επανάληψης
	στ <- τστ
	τστ <- αστ
	αστ <- στ + 1
	Για γρ από αγρ μέχρι τγρ με_βήμα -1 
		α[γρ,στ] <- Χ
		Χ <- Χ + 1
	Τέλος_επανάληψης
	γρ <- τγρ
	τγρ <- αγρ
	αγρ <- γρ + 1
	Για στ από αστ μέχρι τστ
		α[γρ,στ] <- Χ
		Χ <- Χ + 1
	Τέλος_επανάληψης
	στ <- τστ
	τστ <- αστ
	αστ <- στ - 1
Τέλος_επανάληψης 
τέλος σπιραλ



epsilonXi


έφαγα 2 ώρες απ'τη ζωή μου:

ξεκινώντας από την παρατήρηση ότι για τον εξωτερικό από τους «ομόκεντρους κύκλους» ενός πίνακα ΝχΝ θέλουμε:

πρώτη γραμμή από αριστερά: 1, 2, 3, ... , Ν-1,
τελευταία στήλη από πάνω: 1+(Ν-1), 2+(Ν-1), 3+(Ν-1), ... , Ν-1+(Ν-1),
τελευταία γραμμή από δεξιά: 1+2(Ν-1), 2+2(Ν-1), 3+2(Ν-1), ... , Ν-1+2(Ν-1), 
πρώτη στήλη από κάτω: 1+3(Ν-1), 2+3(Ν-1), 3+3(Ν-1), ... , Ν-1+3(Ν-1),

και παρατηρώντας ότι για κάθε επόμενο «ομόκεντρο κύκλο»:
η «ακτίνα» του είναι κατά 2 μικρότερη από τον αμέσως προηγούμενο
και συνεχίζει το μέτρημα από εκεί που είχε σταματήσει ο αμέσως προηγούμενος
καταλήγω:

ν <-- 10  ! ύψος-πλάτος πίνακα
ψ <-- 0   ! η τιμή που θα προστίθεται σε κάθε κελί του εξωτερικού «ομόκεντρου κύκλου»
χ <-- ν-1 ! πόσα κελιά έχει κάθε «τεταρτημόριο» του εξωτερικού «ομόκεντρου κύκλου»


! επειδή ο υπόλοιπος αλγόριθμος για τις περιπτώσεις όπου ν = 2κ+1 αφήνει πάντα το κεντρικό κελί κενό,
! βάζω ξεχωριστή εντολή γι' αυτό το κελί:

α[(ν+1) div 2 , (ν+1) div 2] <-- ν^2

! για κάθε έναν από τους «ομόκεντρους κύκλους» στον πίνακα
για ι από 1 μέχρι (ν+1) div 2

  ! για κάθε κελί κάθε «τεταρτημορίου» του τρέχοντος «κύκλου»
  για ξ από ι μέχρι ν-ι

    ! δίνω τιμή στο κελί της πάνω γραμμής
    α[ι,ξ] <-- ψ+ξ

    ! δίνω τιμή στο κελί της δεξιάς στήλης
    α[ξ, ν-ι+1] <-- ψ+ξ+χ

    ! δίνω τιμή στο κελί της κάτω γραμμής
    α[ν-ι+1, ν+1-ξ] <-- ψ+ξ+2*χ

    ! δίνω τιμή στο κελί της αριστερής στήλης
    α[ν+1-ξ, ι] <-- ψ+ξ+3*χ

  τέλος_επανάληψης

  ψ <-- ψ + 4*χ-1 ! η τιμή που θα προστίθεται σε κάθε κελί του επόμενου εσωτερικού «ομόκεντρου κύκλου»
  χ <-- χ - 2 ! πόσα κελιά έχει κάθε «τεταρτημόριο» του επόμενου εσωτερικού «ομόκεντρου κύκλου»
τέλος_επανάληψης




:)