Σελίδα 1 από 1

Πρόβλημα #2

Δημοσιεύτηκε: Παρ Ιούλ 30, 2010 8:59 pm
από feedWARd
Έχουμε έναν πίνακα Ν χ Ν όπου κάθε στοιχείο του είναι 0 ή 1. Κάθε γραμμή και κάθε στήλη του έχει ένα κουμπί. Πατώντας το κουμπί μιας γραμμής ή μιας στήλης εναλλάσονται όλα τα στοιχεία της (τα 0 γίνονται 1 και τα 1 γίνονται 0). Θέλουμε πατώντας κάποια κουμπιά να αλλάξουμε τον πίνακα ωστέ τελικά να αποτελείται μόνο από μηδενικά. Βρείτε αλγόριθμο που να διαβάζει έναν πίνακα και 1) να ελέγχει αν υπάρχει λύση, 2) να βρίσκει μια λύση που να αποτελείται από τον ελάχιστο αριθμό πατημάτων. Γράψτε time και memory complexıty.

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 3:01 am
από thetrojan01
Μού ρχεται στο μυαλό παραλλαγή ενός γνωστού αλγορίθμου...
Spoiler: show
αναζήτησης, φυσικά.
Ο αλγόριθμος για τι «περιβάλλον προορίζεται» ? Μέγιστο Ν?

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 4:46 am
από feedWARd
thetrojan01 έγραψε:Ο αλγόριθμος για τι «περιβάλλον προορίζεται» ? Μέγιστο Ν?
Το μέγιστο Ν εξαρτάται από την πολυπλοκότητα του αλγορίθμου σου... ;)

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 9:32 am
από Κηπουρίδης
Εμένα πάλι γιατί το μόνο που με έρχεται στο μυαλό είναι μια brute force που για Ν > 10 θα αργεί μισό λεπτό :D ;

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 12:58 pm
από thetrojan01
Κηπουρίδης έγραψε:Εμένα πάλι γιατί το μόνο που με έρχεται στο μυαλό είναι μια brute force που για Ν > 10 θα αργεί μισό λεπτό :D ;
Ναι, αλλά πώς ελέγχεις εάν όντως υπάρχει λύση; (χμμμ κάτι μου λέει ότι αυτό είναι το πιο δύσκολο κομμάτι του αλγορίθμου)...

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 1:00 pm
από chris
@thetrojan01 + Κηπουρίδης: Σκέφτηκα αυτό που σκεφτήκατε, άλλα με την βοήθεια του feedWARd κατέλειξα πως χρειάζεται κάτι πολύ καλύτερο. Για N>5 θα αργεί δραματικά πολύ η bruteforce BFS. Εάν το έπρεπε να το λύσω σε διαγωνιστικό περιβάλλον, θα έκανα αυτήν την χαζή λύση και αν το N είναι μεγαλύτερο από 5 θα θεωρούσα πως δεν υπάρχει δυνατή λύση.

Πιστεύω πως έχω βρεί μια αρχή. Σχεδόν.
Spoiler: show
Για κάθε κελί που δεν είναι 0, πρέπει να πατήσουμε ή το κουμπί της στήλης του, ή το κουμπί της γραμμής του. Το θέμα είναι, ποιό από τα δύο και με ποιά σειρά;
Πιθανώς να δημοσιεύσω την θεωρία μου αργότερα το απόγευμα αν και προς το παρών έχω κολλήσει.

edit: @tt1, αν δεν υπάρχει λύση μια απλή bfs απλά θα τελειώσει χωρίς να έχει βρεί λύση. Βέβαια για N>5 δεν θα τελειώσει :P

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 1:09 pm
από thetrojan01
Όντως, μια BFS θα τερματίσει χωρίς να δώσει απάντηση :geek:

Αμάν εσείς οι ηλεκτρονικοί και οι πύλες NOT σας!
(πλακίζω, πλιζ δίνε μας προβλήματα feedWARd!)

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 1:12 pm
από Κηπουρίδης
thetrojan01 έγραψε:
Κηπουρίδης έγραψε:Εμένα πάλι γιατί το μόνο που με έρχεται στο μυαλό είναι μια brute force που για Ν > 10 θα αργεί μισό λεπτό :D ;
Ναι, αλλά πώς ελέγχεις εάν όντως υπάρχει λύση; (χμμμ κάτι μου λέει ότι αυτό είναι το πιο δύσκολο κομμάτι του αλγορίθμου)...
Ε , αυτό είναι εύκολο , εγώ το συντομότερο νομίζω δεν μπορώ να βρω ........ θα το δοκιμάσω μεθαύριο και θα σε πω .
Ακριβώς εκεί που κοιτιέται ο chris ψάχνομαι κι εγώ αλλά δεν έχω βρει κάτι ενδιαφέρον . Ρε feedWARd , μήπως να μας πεις αν υπάρχει μη - brute force λύση ( τουλάχιστον αν έχεις βρει εσύ κάποια ) , μη παιδευόμαστε άδικα ;

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 3:41 pm
από pman
Πάντα υπάρχει brute-force λύση σε κάποιο πρόβλημα. Όντως BFS θέλει και είσαι έτοιμος. Το πρόβλημα αυτό το έχω ξαναδεί νομίζω κάπου.

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 4:06 pm
από feedWARd
Κηπουρίδης έγραψε: Ρε feedWARd , μήπως να μας πεις αν υπάρχει μη - brute force λύση ( τουλάχιστον αν έχεις βρει εσύ κάποια ) , μη παιδευόμαστε άδικα ;
Υπάρχει μη - brute force λύση. Δεν το έβαλα το πρόβλημα για να μου πείτε "brute force" :P

Ήδη με την παρατήρηση του chris μπορούμε να κατασκευάσουμε μια πολύ καλύτερη brute-force λύση από την BFS-brute force.

Btw, αν θυμάμαι καλά με τον chris βρήκαμε οτί το BFS είναι πολυπλοκότητας Ο(N * 2^(N^2) ) και ίσως και χειρότερο (ανάλογα με το πως θα κωδικοποιήσεις το state σου).

Re: Πρόβλημα #2

Δημοσιεύτηκε: Κυρ Αύγ 01, 2010 4:26 pm
από thetrojan01
BFS με ευριστικούς σκεπτόμουν.
Μα και πάλι, δε μου έρχεται κανένας ευριστικός στο μυαλό. :o

Θα το παλέψω μόλις βρω λίγη ησυχία στο σπίτι.

Re: Πρόβλημα #2

Δημοσιεύτηκε: Δευ Αύγ 02, 2010 3:38 pm
από kernelpanic
Νομίζω γίνεται σε
χρόνο Ν^2
και χώρο Ν^2
(Όχι ακριβώς, αλλά το Ν^2 είναι το σημαντικότερο)

ΕΝΤΙΤ: Έτοιμο! :D

Θεωρητικά δουλεύει μέχρι Ν=20, μετά πρέπει να αλλάξεις τα μεγέθη των πινάκων.
Μπορεί κάποιος να μου εξηγήσει γιατί δεν παίρνει αρχεία με κατάληξη BAS;

Re: Πρόβλημα #2

Δημοσιεύτηκε: Δευ Αύγ 02, 2010 6:11 pm
από chris
kernelpanic έγραψε:Νομίζω γίνεται σε
χρόνο Ν^2
και χώρο Ν^2
(Όχι ακριβώς, αλλά το Ν^2 είναι το σημαντικότερο)

Τώρα το υλοποιώ σε Basic...Θα κάνω έντιτ μόλις τελειώσω.
ΟΟΟΟΟΟΟΟΟΟΟΟΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΧΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙΙ BASIC!
Αστειεύομαι :)

Re: Πρόβλημα #2

Δημοσιεύτηκε: Δευ Αύγ 02, 2010 6:17 pm
από kernelpanic
QuickBasic, για να είμαι πιο ακριβής. :twisted:
Σοβαρά τώρα, τη προτιμώ όταν θέλω να κάνω διάφορα πειράματα, ειδικά όταν αφορούν γραφικά. Κυρίως για την ταχύτητα ανάπτυξης, όμως, όταν θέλω να φτιάξω κάτι απλό.
Και το πιο σημαντικό: γιατί ήταν, είναι και θα μείνει η μοναδική μου αγάπη. :lol:

Re: Πρόβλημα #2

Δημοσιεύτηκε: Τρί Αύγ 03, 2010 3:07 am
από thetrojan01
FUCKING BASIC?!?!?!! :evil:
WELL,

Εικόνα
Spoiler: show
No, Screw you, guys; home.
Spoiler: show
Για όποιον δεν το 'πιασε:

Re: Πρόβλημα #2

Δημοσιεύτηκε: Τετ Αύγ 04, 2010 4:47 pm
από kernelpanic
Βασικά έκανα λάθος πριν:
Γίνεται σε χρόνο Ν^2 και χώρο Ν, με λίγες αλλαγές.
Ποστάρω σε λίγο. :oops:

Re: Πρόβλημα #2

Δημοσιεύτηκε: Δευ Ιαν 03, 2011 7:04 pm
από Κηπουρίδης
Τελικά, πῶς;;;

Re: Πρόβλημα #2

Δημοσιεύτηκε: Δευ Ιαν 03, 2011 8:42 pm
από userresu
Spoiler: show
1) Πατάω το κουμπί της πρώτης γραμμής
2) Για κάθε κουμπί στήλης έστω j, το πατάω αν το στοιχείο στη θέση (1,j) είναι 1, αλλιώς δεν το πατάω.
3) Για κάθε κουμπί γραμμής (από τη 2η και μετά), αν όλα τα στοιχεία της γραμμής είναι 0 δεν το πατάω, ενώ αν όλα είναι 1 το πατάω. Σε διαφορετική περίπτωση δεν υπάρχει λύση.
4) Αν ο αριθμός των κουμπιών που πάτησα στα παραπάνω βήματα είναι a, η απάντηση είναι min(a,2N-a) (Σκεφτείτε γιατι)
Time: O(N2)
Memory: O(N) (το προφανές είναι O(N2) αλλα μπορεί να γίνει O(N), το αφήνω σαν άσκηση)

Re: Πρόβλημα #2

Δημοσιεύτηκε: Τρί Ιαν 04, 2011 1:43 am
από Κηπουρίδης
Ἰδιοφυές! Δὲν θὰ τὸ ἔβγαζα οὔτε τοῦ χρόνου. Καὶ πάλι μπράβο:D.

Re: Πρόβλημα #2

Δημοσιεύτηκε: Τρί Ιαν 04, 2011 7:32 pm
από kernelpanic
To «σε λίγο» είναι σχετικό. Όπως τα τέρμινα :oops: