Πίνακες Πολλαπλών Διαστάσεων (Multidimensional arrays)

Σχετικά έγγραφα
Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

ΕΠΛ131 Αρχές Προγραμματισμού

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Εισαγωγή στον Προγραμματισμό

Δομές ελέγχου ροής προγράμματος

Στοιχειώδεις Δομές Δεδομένων

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Αντικειμενοστρεφής Προγραμματισμός

ΕΠΛ131 Αρχές Προγραμματισμού

Εισαγωγή στον Προγραμματισμό

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

Δομές Δεδομένων & Αλγόριθμοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ131 Αρχές Προγραμματισμού Ι

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

Μία Μελέτη Περίπτωσης: Διήθηση

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

Βασικά Στοιχεία της Java

Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Γλώσσες Προγραμματισμού

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Βασικάχαρακτηριστικάτηςγλώσσας. Πίνακες, Έλεγχος Ροής και Βρόχοι

ΕΠΛ 131 Φροντιστήριο 2

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Αλγοριθμικές Δομές Επιλογής και Επανάληψης Συνθήκες, Λογικές Εκφράσεις και Βρόγχοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΕΠΛ131 Αρχές Προγραμματισμού

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Διαδικασιακός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΕΠΛ131 Αρχές Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Δομές ελέγχου & επανάληψης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 8/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Σχηματίζοντας Γραφικές Παραστάσεις για Ημίτονο και Συνημίτονο και Ελέγχοντας Περιορισμούς σε Συστάδες Καρτών Τόμπολας

Αντικειµενοστρεφής Προγραµµατισµός

3. Εκφράσεις και έλεγχος ροής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2007 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

public class ArrayStack implements Stack {

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Ο βρόχος for Η εντολή for χρησιμοποιείται για τη δημιουργία επαναληπτικών βρόχων στη C

ΕΡΓΑΣΙΑ 2. Κατασκευάζοντας Ημερολόγια. Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Επανάληψη. Εντολές while, for, do-while

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Διαδικασιακός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Εισαγωγή στον Προγραμματισμό

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

for for for for( . */

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΕΠΛ Φροντιστήριο 3

CSD Univ. of Crete Φθινόπωρο Άσκηση 1 Εκφώνηση

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 7: Πίνακες (Arrays)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07

ΕΡΓΑΣΙΑ 4. Εκλογικό Σύστημα με Μεταφορά και Συσσώρευση Ψήφων. Ημερομηνία Ανάρτησης: 16/04/2018 Ημερομηνία Παράδοσης: 04/05/2018, 09:00

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

Διάλεξη 6: Δείκτες και Πίνακες

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Transcript:

Πίνακες Πολλαπλών Διαστάσεων (Multidimensional arrays) VII-1

Δισδιάστατοι Πίνακες (Two-Dimensional arrays) Πίνακας στοιχείων για κάθε πείραμα και τα αποτελέσματά του Πίνακας βαθμολογιών για κάθε φοιτητή στις εργασίες του Πίνακας grayscale τιμών για κάθε pixel σε μια δισδιάστατη εικόνα Μαθηματική έννοια: Μήτρα (Matrix) VII-2

Πολυδιάστατοι Πίνακες Multidimensional arrays Ένας πίνακας είναι πολυδιάστατος εάν έχει δύο ή περισσότερες διαστάσεις char[][] tictac = {{ X, O, X, { O, X, O,{ O, X, X ; Στήλη 0 1 2 Σειρά 0 X O X 1 O X O tictac[1][2] 2 O X X VII-3

Gene 1 Gene n Reference: Botstein & Brown group gene expressed gene not expressed VII-4

Δισδιάστατοι Πίνακες σε Java Πρόσβαση στον πίνακα: Χρησιμοποιούμε την έκφραση a[i][j] για πρόσβαση στο στοιχείο που βρίσκεται στη σειρά i και στη στήλη j. Η αρίθμηση των σειρών και στηλών αρχίζει από το 0. int M = 10; int N = 3; double[][] a = new double[m][n]; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { a[i][j] = 0.0; VII-5

Αρχικοποίηση Δισδιάστατου Πίνακα Καταγράφοντας ρητά τις τιμές, σειρά με σειρά. double[][] p = { {.92,.02,.02,.02,.02, {.02,.02,.32,.32,.32, {.02,.02,.02,.92,.02, {.92,.02,.02,.02,.02, {.47,.02,.47,.02,.02, ; VII-6

double[][][] table = new double[7][5][6]; 1. Ο πίνακας table έχει τρεις διαστάσεις και σύνολο 210 στοιχεία. Οι δείκτες της πρώτης διάστασης είναι 0..6, της δεύτερης 0..4 και της τρίτης 0..5 2. table[2][3][4] σημαίνει το στοιχείο του πίνακα table που έχει δείκτη 2 στη πρώτη διάσταση (δηλαδή το τρίτο σε σειρά), έχει δείκτη 3 στη δεύτερη διάσταση και δείκτη 4 στη τρίτη διάσταση 1. Όλα τα στοιχεία του πίνακα table αρχικοποιούνται αυτόματα στην τιμή 0.0 VII-7

Παράδειγμα: Πρόσθεση Τετραγωνικών Πινάκων, Ν Ν όλες οι τιμές αρχικοποιούνται στο 0 double[][] c = new double[n][n]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) c[i][j] = a[i][j] + b[i][j]; VII-8

Παράδειγμα: Πολλαπλασιασμός Τετραγωνικών Πινάκων, Ν Ν όλες οι τιμές αρχικοποιούνται στο 0 double[][] c = new double[n][n]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] += a[i][k] * b[k][j]; Πόσες φορές εκτελείται ο τελεστής * για το γινόμενο δύο αριθμών; Α. Ν Β. Ν 2 C. N 3 D. N 4 VII-9

Παράδειγμα: Είναι δεδομένος πίνακας (σε σχέση με το παιγνίδι tictac-toe) τελείως γεμάτος; Χ Ο E E Ο E Χ E E Όχι Χ Ο Ο Ο Ο Χ Χ Χ Ο Ναι public static boolean filled (char[][] ttt_board) { boolean ans = true; for (int row = 0; row < 3; row++) for (int col = 0; col < 3; col++) if (ttt_board[row][col] == E ) ans = false; return ans; VII-10

public static boolean filled (char ttt_board[3][3]) { // alternative definition using do-while boolean ans; int row = 0; do{ int col = 0; do { ans = ttt_board[row][col]!= E ; col++; while (ans && col < 3); row++; while (ans && row < 3); return ans; Άσκηση: Ορίστε τη στατική μέθοδο empty που να λέει κατά πόσο δεδομένος πίνακας (σε σχέση με το παιγνίδι tic-tac-toe) είναι τελείως κενός ή όχι VII-11

Πρόβλημα: Να ορισθεί η στατική μέθοδος win η οποία λαμβάνει ως παράμετρο δεδομένο πίνακα που αντιπροσωπεύει τη διάταξη των επιλογών των δύο παιχτών στο παιγνίδι tic-tac-toe, και αποφασίζει εάν η διάταξη αποτελεί νίκη για έναν από τους παίκτες Διάσπαση προβλήματος σε υπο-προβλήματα Είναι τα περιεχόμενα δεδομένης σειράς τα ίδια; Είναι τα περιεχόμενα δεδομένης στήλης τα ίδια; Είναι όλα τα στοιχεία της μίας ή της άλλης διαγωνίου τα ίδια; VII-12

Προσδιορισμός πιο βασικών υπο-προβλημάτων Είναι όλα τα στοιχεία δεδομένου μονοδιάστατου πίνακα τα ίδια; Αντιγραφή δεδομένης στήλης δυσδιάστατου πίνακα σε μονοδιάστατο πίνακα. Αντιγραφή δεδομένης διαγωνίου δυσδιάστατου πίνακα σε μονοδιάστατο πίνακα. Σημείωση: Μόνο τα στοιχεία της εξωτερικής διάστασης μπορεί να αναφερθούν ως ολότητες, σε σχέση με πολυδιάστατους πίνακες. Επομένως σχετικά με δυσδιάστατους πίνακες, μπορεί να γίνει άμεση αναφορά στις σειρές του πίνακα, ως ολότητες (δηλαδή ως μονοδιάστατους πίνακες), αλλά όχι στις στήλες ή τις διαγώνιους του. VII-13

char [][] table = new char [3][3]; table ισοδυναμεί με τη διεύθυνση του πρώτου στοιχείου (table[0][0]) table[0] ισοδυναμεί με τη διεύθυνση της πρώτης σειράς του πίνακα, δηλαδή και πάλι με τη διεύθυνση του στοιχείου table[0][0] table[1] ισοδυναμεί με τη διεύθυνση της δεύτερης σειράς του πίνακα, δηλαδή με τη διεύθυνση του στοιχείου table[1][0] table[2] ισοδυναμεί με τη διεύθυνση της τρίτης σειράς του πίνακα, δηλαδή με τη διεύθυνση του στοιχείου VII-14 table[2][0]

Ορισμός στατικών μεθόδων για βασικά υπο-προβλήματα // Are all elements of table the same? public static boolean same_elem (char[] table[]){ boolean ans = true; for (int k = 1; k < table.length; k++) if (table[k]!= table[0]) ans = false; return ans; // Copy column col of table into array col_table public static void copy_col (char[][] table, char[] col_table, int col){ for (int k = 0; k < col_table.length; k++) col_table[k] = table[k][col]; // Copy diagonal of table public static void copy_diag1 (char[][] table, char[] diag) for (int k = 0; k < diag.length; k++)diag[k] = table[k][k]; // Copy anti-diagonal of table public static void copy_diag2 (char[][] table, char[] diag) { for (int k = 0; k < diag.length; k++) diag[k] = table[k][2 k]; VII-15

Αξιοποίηση των προηγούμενων μεθόδων για τον ορισμό της win public static boolean win (char[][] ttt_b) { char[] auxt = new char[3]; int k = 0; boolean ans = false; while (k < 3 &&!ans) { // is there a winning row? if (ttt_b[k][0]!= E && same_elem(ttt_b[k])) { ans = true; System.out.println( Player + ttt_b[k][0] + wins on row + (k+1)); k++; Χρειάζονται οι παρενθέσεις; if (ans); // there is a winning row! else { k = 0; while (k < 3 &&!ans) { // is there a winning col? copy_col(ttt_b, auxt, k); if (auxt[0]!= E && same_elem(auxt)) { ans = true; System.out.println( Player + auxt[0] + wins on column + (k+1)); k++; VII-16

// continuing the definition of win. if (ans); // there is a winning column! else {copy_diag1(ttt_b, auxt); // winning diagonal? if (auxt[0]!= E && same_elem(auxt)) { // yes! ans = true; System.out.println( Player + auxt[0] + wins on diagonal ; else {copy_diag2(ttt_b, auxt); // winning anti-diagonal? if (auxt[0]!= E && same_elem(auxt)) { // yes! ans = true; System.out.println( Player + auxt[0] + wins on antidiagonal ); return ans; VII-17

win same_elem copy_col copy_diag1 copy_diag2 Διάσπαση προβλήματος σε υπο-προβλήματα Ιεραρχική δομή Άσκηση: Αναδιατυπώστε το σχεδιασμό της win ώστε να υπάρχει μία καλύτερη ιεραρχική δομή και κατ επέκταση να υπάρχει μεγαλύτερη αφαιρετικότητα VII-18

win Row_win Col_win Diag_win AntiDiag_win same_elem copy_col copy_diag1 copy_diag2 VII-19

Ολόκληρη η κλάση TicTacToe μαζí με τη main για τη δοκιμή της win public class TicTacToe { public static boolean same_elem (char[] table[]){.. public static void copy_col (char[][] table, char[] col_table, int col){. public static void copy_diag1 (char[][] table, char[] diag) {.. public static void copy_diag2 (char[][] table, char[] diag) {. public static boolean win (char[][] ttt_b) {. public static void main (String[] args){ char[][] board = new char[3][3]; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) board[i][j] = args[0].charat(i*3+j); if (win(board)) System.out.println( Thus there is a winner! ); else System.out.println( Nobody wins! ); % java TicTacToe EEXEEOEEE Nobody wins! % java TicTacToe XEEXEEXEE Player X wins on col 1 Thus there is a winner! % java TicTacToe EEOEOEOEE Player O wins on antidiagonal Thus there is a winner! VII-20

Παράδειγμα: Περπατώ, αποφεύγοντας προηγούμενα σημεία Μοντέλο Ένα πλέγμα Ν Ν. Αρχίζω από το μεσαίο σημείο. (Self-avoiding walk) Κινούμαι τυχαία σε κάποια γειτονική διασταύρωση, αποφεύγοντας διασταυρώσεις από τις οποίες έχω ήδη περάσει (ένα βήμα πάνω, κάτω, δεξιά ή αριστερά). Κατορθώνω να δραπετεύσω ή εγκλωβίζομαι; Δραπετεύω όταν φτάσω σε ακραίο σημείο του πλέγματος (πρώτη/τελευταία σειρά, ή πρώτη/ τελευταία στήλη). Εγκλωβίζομαι όταν δεν μπορώ να προχωρήσω από μη-ακραίο σημείο. Εφαρμογές Πολυμερή, Στατιστική Μηχανική, κτλ VII-21

Ερωτήματα προς διερεύνηση Ποιο είναι το ποσοστό επιτυχίας μου σε ένα πλέγμα 5 5; Σε ένα πλέγμα Ν Ν; Σε ένα πλέγμα Ν Ν Ν; VII-22

Από την αλγοριθμική σκοπιά ποια ερωτήματα πρέπει να απαντηθούν (με άλλα λόγια ποια είναι τα βασικά υπο-προβλήματα που χρειάζεται να επιλυθούν); Για δεδομένη προσπάθεια Πως καταγράφω την πορεία μου, για να γνωρίζω τα σημεία που έχω ήδη επισκεφτεί; Πως αντιλαμβάνομαι ότι έχω κατορθώσει να δραπετεύσω, ή το αντίθετο ότι έχω εγκλωβιστεί, για να τερματίσω την προσπάθεια; Σε περίπτωση που δεν έχω ακόμη εγκλωβιστεί/δραπετεύσει, πως επιλέγω με τυχαίο τρόπο την επόμενη μου κίνηση; Αλγοριθμική δομή: απροσδιόριστη επανάληψη (συνεχίζω κανονικά την προσπάθεια μου, δηλαδή την πορεία μου, ενόσω δεν έχω ακόμη κατορθώσει να δραπετεύσω. Διακόπτω, όμως, ανώμαλα την πορεία μου, μόλις εγκλωβιστώ, εάν και εφόσον αυτό συμβεί με άλλα λόγια επιλογή εντός της επανάληψης ως προς το ενδεχόμενο πρόωρου τερματισμού της επανάληψης) Για δεδομένο σύνολο προσπαθειών Διαδοχικά εκπληρώνω το δεδομένο σύνολο προσπαθειών που έχω στη διάθεσή μου, αρχίζοντας κάθε προσπάθειά μου από το μεσαίο σημείο του πλέγματος, και παράλληλα καταγράφω τις επιτυχίες (δραπέτευσα!) και αποτυχίες μου (εγκλωβίστηκα!). Στο τέλος παρουσιάζω το ποσοστό αποτυχιών (ή επιτυχιών) μου. Αλγοριθμική δομή: απαριθμητή επανάληψη VII-23

Αλγόριθμος λύσης σε υψηλό επίπεδο ανάλυσης δίνοντας όμως την ουσία Αρχικοποιώ τον μετρητή μου για τις αποτυχημένες προσπάθειες στο 0 Επαναλαμβάνω από την πρώτη μέχρι την τελευταία προσπάθεια που έχω Αρχικοποιώ το πλέγμα μου για να φαίνεται ότι δεν έχω ακόμη ξεκινήσει την τρέχουσα προσπάθειά μου και τοποθετώ τον εαυτό μου στο μεσαίο σημείο Επαναλαμβάνω ενόσω δεν έχω ακόμη κατορθώσει να δραπετεύσω Καταγράφω στο πλέγμα το σημείο που βρίσκομαι. Αν δυστυχώς έχω εγκλωβιστεί, καταγράφω στο μετρητή μου την αποτυχημένη προσπάθεια και διακόπτω (ανώμαλα)τη συγκεκριμένη προσπάθεια! πρόωρη διακοπή και έξοδος από τον εσωτερικό βρόγχο Επιλέγω τυχαία, ανάμεσα στις πιθανές επιλογές που έχω, το επόμενο σημείο στο οποίο θα πάω Παρουσιάζω το ποσοστό των αποτυχιών μου! VII-24

Διατύπωση βημάτων αλγορίθμου σε (ψευδο)κώδικα int deadends = 0; // no of unsuccessful tries for (t = 0; t < T; t++) { // I repeat for each try boolean[][] a = new boolean[n][n]; // grid representation int x = N/2, y = N/2; while (x > 0 && x < N-1 && y > 0 && y < N-1) {// I have not escaped yet a[x][y] = true; // I am at this point if (a[x+1][y] && a[x-1][y] && a[x][y+1] && a[x][y-1]){ // Alas... I am trapped! deadends++; break; // I must interrupt this try! // I can proceed... double r = Math.random(); //.. but in a random way if (r < 0.25) {if (!a[x+1][y]) x++; else if (r < 0.50) {if (!a[x-1][y]) x--; else if (r < 0.75) {if (!a[x][y+1]) y++; else if (r < 1.0) {if (!a[x][y-1]) y--; System.out.println(100*deadEnds/T + % of dead ends ); VII-25

Πλήρης Υλοποίηση Αλγορίθμου public class SelfAvoidingWalk { public static void main(string[] args) { int N = Integer.parseInt(args[0]); int T = Integer.parseInt(args[1]); int deadends = 0; // grid size // number of trials // trials resulting in dead end for (int t = 0; t < T; t++) { boolean[][] a = new boolean[n][n]; // intersections visited int x = N/2, y = N/2; // current position while (x > 0 && x < N-1 && y > 0 && y < N-1) { if (a[x-1][y] && a[x+1][y] && a[x][y-1] && a[x][y+1]) { deadends++; break; a[x][y] = true; // mark as visited double r = Math.random(); if (r < 0.25) { if (!a[x+1][y]) x++; else if (r < 0.50) { if (!a[x-1][y]) x--; else if (r < 0.75) { if (!a[x][y+1]) y++; else if (r < 1.00) { if (!a[x][y-1]) y--; System.out.println(100*deadEnds/T + "% dead ends"); VII-26

Σχολιάστε την ακόλουθη εντολή επιλογής (στο πλαίσιο της απροσδιόριστης επανάληψης) double r = Math.random(); if (r < 0.25) {if (!a[x+1][y]) x++; else if (r < 0.50) {if (!a[x-1][y]) x--; else if (r < 0.75) {if (!a[x][y+1]) y++; else if (r < 1.0) {if (!a[x][y-1]) y--; Έστω ότι, σε ένα δεδομένο σημείο της εκτέλεσης, οι είσοδοι a[x+1][y], a[x][y+1] και a[x][y-1] είναι true και η μεταβλητή r διαδοχικά λαμβάνει τις τιμές 0.1, 0.045, 0.83, 0.95, 0.8, και 0.62 VII-27

Παραδείγματα Self-Avoiding Walks VII-28

Πως μπορούμε να επεκτείνουμε τον κώδικα, έτσι ώστε να παρουσιάζονται οι προσπάθειες; Δεν μπορούμε ακόμη να παρουσιάσουμε κάτι με γραφικό τρόπο. Μπορούμε όμως με διακριτό τρόπο, π.χ. +----------+ ++++ ++++ ++ O+ +++ ++ + F +----------+ This was a successful walk +----------+ +++ +F++ +++O +++ +----------+ This was NOT a successful walk VII-29

// Including new public static methods in class SelfAvoidingWalk public static void putchar(char c){system.out.print(c); public static void newl (){putchar('\n'); public static void draw_line(char c, int len){ for (int i = 0; i < len; i++) putchar(c); // array a gives the grid with the walk, x and y are the coordinates of // the final position public static void display_walk(boolean[][] a, int x, int y){ newl(); putchar('+'); draw_line('-', a[0].length); putchar('+'); for (int i = 0; i < a[0].length; i++){ newl(); putchar(' '); for (int j = 0; j < a[0].length; j++) if (a[i][j]) {if (i == a[0].length/2 && j == i) putchar( O'); else if (i==x && j==y) putchar( F ); else putchar('+'); else putchar(' '); putchar(' '); newl(); putchar('+'); draw_line('-', a[0].length); putchar('+'); newl(); ΕΠΛ131 Τροποποιείστε Ενότητα VII κατάλληλα την main για να εκτυπώνονται οι προσπάθειες VII-30

Σύνοψη Παραδείγματα χρήσης δισδιάστατων πινάκων Απευθείας πρόσβαση σε σειρές, αλλά όχι σε στήλες Οι πίνακες αποτελούν Ένα οργανωμένο τρόπο αποθήκευσης τεράστιων ποσοτήτων δεδομένων Σχεδόν το ίδιο εύκολοι στη χρήση τους, όπως και οι βασικοί τύποι δεδομένων Στη συνέχεια θα δούμε πως πίνακες μπορούν να αρχικοποιηθούν διαβάζοντας μεγάλες ποσότητες στοιχείων από αρχεία VII-31