Κλειδιά (keys)
Ο Τιμόθεος ο αρχιτέκτων έχει σχεδιάσει ένα νέο παιχνίδι διαφυγής. Σε αυτό το παιχνίδι υπάρχουν δωμάτια αριθμημένα από το
μέχρι το
. Αρχικά, κάθε δωμάτιο περιέχει μόνο ένα κλειδί. Κάθε
κλειδί έχει έναν τύπο, ο οποίος είναι ένας ακέραιος μεταξύ
και
, συμπεριλαμβανομένων. Ο τύπος του κλειδιού στο δωμάτιο
(
) είναι
. Να σημειωθεί ότι πολλά δωμάτια
μπορούν να περιέχουν κλειδιά του ιδίου τύπου, δηλαδή οι τιμές των
δεν είναι υποχρεωτικά μοναδικές.
Υπάρχουν επίσης αμφίδρομοι σύνδεσμοι μέσα στο παιχνίδι, αριθμημένοι από το
μέχρι το
. Ο σύνδεσμος
(
) συνδέει δύο διαφορετικά δωμάτια
και
. Ένα
ζευγάρι δωματίων μπορεί να συνδέεται με πολλούς συνδέσμους.
Το παιχνίδι παίζεται από έναν παίκτη που μαζεύει τα κλειδιά και μετακινείται μεταξύ των δωματίων διασχίζοντας τους συνδέσμους. Λέμε ότι ο παίκτης διασχίζει τον σύνδεσμο όταν χρησιμοποιεί
αυτόν τον σύνδεσμο για να μετακινηθεί από το δωμάτιο
στο δωμάτιο
, ή αντίστροφα. Ο παίκτης μπορεί να διασχίσει τον σύνδεσμο
μόνο αν έχει προηγουμένως μαζέψει ένα κλειδί με τύπο
.
Σε οποιοδήποτε σημείο του παιχνιδιού ο παίκτης βρίσκεται σε κάποιο δωμάτιο και μπορεί να κάνει δύο ενέργειες:
- να μαζέψει το κλειδί από το δωμάτιο
, του οποίου ο τύπος είναι
(εκτός αν το έχει ήδη μαζέψει),
- να διασχίσει έναν σύνδεσμο
, όπου είτε
=
ή
=
, αν ο παίκτης έχει ήδη μαζέψει το κλειδί με τύπο
. Προσέξτε ότι ο παίκτης ποτέ δεν χάνει τα κλειδιά που έχει μαζέψει.
Ο παίκτης ξεκινά το παιχνίδι από κάποιο δωμάτιο χωρίς να έχει κανένα κλειδί στην κατοχή του. Το δωμάτιο
είναι προσβάσιμο από το δωμάτιο
, αν ο παίκτης που ξεκινά το παιχνίδι από το δωμάτιο
μπορεί να κάνει μια σειρά από ενέργειες όπως αυτές που περιγράφονται πιο πάνω και να φτάσει στο δωμάτιο
.
Για κάθε δωμάτιο (
), έστω
το πλήθος των δωματίων που είναι προσβάσιμα από το δωμάτιο
. Ο Τιμόθεος θέλει να γνωρίζει το σύνολο δεικτών
που επιτυγχάνουν την ελάχιστη δυνατή τιμή
για
.
Λεπτομέρειες υλοποίησης
Πρέπει να υλοποιήσετε την παρακάτω συνάρτηση:
int[] find_reachable(int[] r, int[] u, int[] v, int[] c)
: ένας πίνακας μήκους
. Για κάθε
(
), το κλειδί στο δωμάτιο
είναι τύπου
.
,
: δύο πίνακες μήκους
. Για κάθε
(
), ο σύνδεσμος
συνδέει τα δωμάτια
και
.
: ένας πίνακας μήκους
. Για κάθε
( \(0 \le j \le m - 1), ο τύπος κλειδιού που χρειάζεται για να διασχίσουμε το σύνδεσμο \)j\( είναι \)c[j]~.
- Αυτή η συνάρτηση πρέπει να επιστρέφει έναν πίνακα
μήκους
. Για κάθε
, η τιμή του
θα είναι
αν για κάθε
τέτοιο ώστε
ισχύει
. Αλλιώς, η τιμή του
θα είναι
.
Παραδείγματα
Παράδειγμα 1
Έστω η παρακάτω κλήση:
find_reachable([0, 1, 1, 2],
[0, 0, 1, 1, 3], [1, 2, 2, 3, 1], [0, 0, 1, 0, 2])
Αν ο παίκτης ξεκινήσει το παιχνίδι στο δωμάτιο 0, μπορεί να κάνει την ακόλουθη σειρά ενεργειών:
Δωμάτιο που βρίσκεται | Ενέργεια |
0 | Μάζεψε το κλειδί τύπου 0 |
0 | Διάσχισε τον σύνδεσμο 0 για το δωμάτιο 1 |
1 | Μάζεψε το κλειδί τύπου 1 |
1 | Διάσχισε τον σύνδεσμο 2 για το δωμάτιο 2 |
2 | Διάσχισε τον σύνδεσμο 2 για το δωμάτιο 1 |
1 | Διάσχισε τον σύνδεσμο 3 για το δωμάτιο 3 |
Επομένως, το δωμάτιο είναι προσβάσιμο από το δωμάτιο
. Ομοίως, μπορούμε να δημιουργήσουμε ακολουθίες που δείχνουν ότι όλα τα δωμάτια είναι προσβάσιμα από το δωμάτιο
, το οποίο σημαίνει ότι
=
. Ο παρακάτω πίνακας δείχνει τα προσβάσιμα δωμάτια για όλα τα
δωμάτια εκκίνησης:
Δωμάτιο εκκίνησης i | Προσβάσιμα δωμάτια | p[i] |
0 | [0, 1, 2, 3] | 4 |
1 | [1, 2] | 2 |
2 | [1, 2] | 2 |
3 | [1, 2, 3] | 3 |
Η ελάχιστη τιμή του για όλα τα δωμάτια είναι
, και αυτό επιτυγχάνεται για
=
ή
=
. Επομένως, η συνάρτηση πρέπει να επιστρέψει [
].
Παράδειγμα 2
find_reachable([0, 1, 1, 2, 2, 1, 2],
[0, 0, 1, 1, 2, 3, 3, 4, 4, 5],
[1, 2, 2, 3, 3, 4, 5, 5, 6, 6],
[0, 0, 1, 0, 0, 1, 2, 0, 2, 1])
Ο παρακάτω πίνακας δείχνει τα προσβάσιμα δωμάτια:
Δωμάτιο εκκίνησης i | Προσβάσιμα δωμάτια | p[i] |
0 | [0, 1, 2, 3, 4, 5, 6] | 7 |
1 | [1, 2] | 2 |
2 | [1, 2] | 2 |
3 | [3, 4, 5, 6] | 4 |
4 | [4, 6] | 2 |
5 | [3, 4, 5, 6] | 4 |
6 | [4, 6] | 2 |
Η ελάχιστη τιμή του για όλα τα δωμάτια είναι
και αυτό επιτυγχάνεται για
∈ {
}. Επομένως, η συνάρτηση πρέπει να επιστρέψει [
].
Παράδειγμα 3
find_reachable([0, 0, 0], [0], [1], [0])
Ο παρακάτω πίνακας δείχνει τα προσβάσιμα δωμάτια:
</tr>Δωμάτιο εκκίνησης i | Προσβάσιμα δωμάτια | p[i] |
0 | [0, 1] | 2 |
1 | [0, 1] | 2 |
2 | [2] | 1 |
Η ελάχιστη τιμή του για όλα τα δωμάτια είναι
και αυτό επιτυγχάνεται για
=
. Επομένως, η συνάρτηση πρέπει να επιστρέψει [
].
Περιορισμοί
για κάθε
και
για κάθε
για κάθε
Υποπροβλήματα
- (
βαθμοί)
=
για κάθε
και
- (
βαθμοί)
- (
βαθμοί)
- (
βαθμοί)
(για κάθε
) και
(για κάθε
)
- (
βαθμοί) Κανένας επιπλέον περιορισμός.
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την εισοδο ως εξής:
- γραμμή
:
- γραμμή
:
...
- γραμμή
(
):
Ο υποδειγματικός βαθμολογητής τυπώνει την τιμή που επιστρέφει η συνάρτηση find_reachable στην ακόλουθη μορφή:
- γραμμή
:
...
Comments