n° 174
Maggio 2012
Maggio 18, 2012, 05:58:21 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Creazione matrice con dati a Zig-Zag  (Letto 646 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« inserita:: Febbraio 01, 2012, 06:17:05 pm »

Ciao a tutti,
Sto facendo un esercizio che mi chiede di creare una matrice ed inserire numeri interi a zig-zag, come vi mostro qui sotto partendo dal basso con lo zero:


 9 10 17 18 22 23
 3  8 11 16 19 21
 2  4  7 12 15 20
 0  1  5  6 13 14


Ho creato la matrice con un vettore in quanto prende dati dall'utente e ho realizzato una normale matrice che se fosse 4X4 sarebbe:

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


ma non riesco proprio a capire il ragionamento dello zig zag.
Vi posto il poco codice che ho scritto:

Codice:
int main () {
int rows, cols, n=-1;
cout << "Insert a number of rows: \n";
cin >> rows;
cout << "Insert a number of cols: \n";
cin >> cols;
vector<int>matrix(rows*cols,0);

for(int i=0;i<rows;++i) {
for (int j=0;j<cols;++j) {
matrix[j*cols+i]=n+=1;
}
}
for(int i=rows-1;i>=0;--i) {
cout << endl;
for (int j=0;j<cols;++j) {
cout << setw(3) << matrix[j*cols+i];
}
}
return 0;
}

Avete qualche idea???
Grazie a tutti!!
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +39/-1
Scollegato Scollegato

Messaggi: 1959



Mostra profilo WWW
« Risposta #1 inserita:: Febbraio 01, 2012, 07:02:33 pm »

E' un esercizio interessante e non banale: probabilmente è possibile inventare una funzione matematica per associare immediatamente m(x,y) con un numero, ma senza dubbio non è facile da trovare.

Molto più facile è scrivere un algoritmo, ma per prima cosa devi essere in grado di farlo a mano. Sei in grado, ad esempio, di riempire una matrice di 5x3 a zigzag manualmente?

Codice:
.. .. .. .. ..
.. .. .. .. ..
00 .. .. .. ..

Una volta riempita questa, possiamo cominciare ad analizzare il procedimento che hai seguito, passo per passo, e a descriverlo in pseudocodice.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« Risposta #2 inserita:: Febbraio 01, 2012, 07:18:10 pm »

Purtoppo non riesco a trovare un algoritmo adatto, prima di tutto non riesco a capire se è più facile cercare di risolverla tramite dei cicli FOR il che credo sia abbastanza complicato, oppure attraverso ricorsione ed includere tutte le diverse soluzioni ma viene una cosa lunghissima e quasi sicuramente non corretta.

Se procediamo per ricorsione:
parto dalla prima cella:

if ((r==0) && (c==0)) {
        matrix[c*cols+r]=n+=1;
        step=true;
        return GetFunction(r,c+1);
}

step è una variabile booleana che mi dice se prima ho fatto un passo orizzontale o verticale perchè se l'ho fatto allora devo andare in diagonale, e da qui comincio a fare tutte le ipotesi con la clausola IF.

Cosa ne pensi?
Registrato
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« Risposta #3 inserita:: Febbraio 01, 2012, 07:42:59 pm »

Scusa ti scrivo meglio il codice che intendevo:

bool step=false;
int rows, cols, n=-1;
vector<int>matrix(rows*cols,0);
int GetFunction(int r, int c) {

if ((r==0) && (c==0)) {
        matrix[c*cols+r]=n+=1;
        step=true;
        return GetFunction(r,c+1);
}

dimmi se c'è qualcosa che spiego male...
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +39/-1
Scollegato Scollegato

Messaggi: 1959



Mostra profilo WWW
« Risposta #4 inserita:: Febbraio 01, 2012, 07:45:03 pm »

Aspetta, prima di arrivare al codice. Sai riempire la matrice che ti ho dato coi numeri da 0 a 14, scrivendoli manualmente?
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« Risposta #5 inserita:: Febbraio 01, 2012, 07:49:55 pm »

dici in questo modo?

3  8  9 13 14
2  4  7 10 12
0  1  5  6  11
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +39/-1
Scollegato Scollegato

Messaggi: 1959



Mostra profilo WWW
« Risposta #6 inserita:: Febbraio 01, 2012, 07:52:07 pm »

Esatto: come hai fatto?

1) Parto dall'angolo in basso a sinistra e scrivo 0.
2) Mi sposto a destra. Scrivo 1.

....

passi 3, 4,  5 e 6?
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« Risposta #7 inserita:: Febbraio 01, 2012, 08:05:40 pm »

3)mi sposto in su perchè non posso fare la diagonale, dove metto 3 posso allora faccio la diagonale, arrivo dove c'è 5 e vado a 6 cosi rifaccio la diagonale, con una linea immaginaria che segue i numeri in ordine crescente diventa una linea a zig-zag...
non so se mi son spiegato bene...
Registrato
Roberto Allegra
Global Moderator
Hero Member
*****

Karma: +39/-1
Scollegato Scollegato

Messaggi: 1959



Mostra profilo WWW
« Risposta #8 inserita:: Febbraio 01, 2012, 09:02:06 pm »

Formalizzala meglio, e con più chiarezza e calma: devi pensare ad un algoritmo che dovrai descrivere al computer. Traccia base:

1) Parto dall'angolo in basso a sinistra. Scrivo 0.
2) Si può andare a destra?
    * Se sì vado lì e scrivo numero dopo.
    * Se no: si può andare in alto?
          * Se sì vado in alto e scrivo il numero dopo
          * Se no ho finito
3) Si può andare in alto a sinistra?
    * Se sì:
          * vado lì e scrivo il numero dopo.
          * Ripeto il punto (3)
4) ...?
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
violalbi91
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 7


Mostra profilo
« Risposta #9 inserita:: Febbraio 01, 2012, 09:31:07 pm »

Hai ragione scusami, allora nel punto 4 devo fare una diagonale fino a che posso ovvero:

4)Posso spostarmi in diagonale(riga+1 e colonna+1)?
   Se si mi sposto e scrivo il numero successivo
   Se no ripeto il punto 2

5)Posso spostarmi in diagonale (riga-1 colonna-1)?
   Se mi sposto e si scrivo il numero successivo
   se no ripeto il punto 2

giusto?

Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +175/-11
Scollegato Scollegato

Messaggi: 2515


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #10 inserita:: Febbraio 04, 2012, 12:39:26 am »

Sfortunatamente non ho molto tempo, ma vi lascio almeno questo fondamentale suggerimento col quale giocare un po'.

Codice:
#define ASIZE 9

int main(void)
{
    int i, j;

    for (i = 0; i < ASIZE; ++i)
    {
for (j = 0; j < ASIZE; ++j)
{
   printf("%2d ", i + j);
}
puts("");
    }
    return(0);
}

Eccone l'output:


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


Vedete qualcosa di interessante? Ghigno
Per ogni antidiagonale, quale che sia la dimensione della matrice (anche rettangolare), la somma degli indici è costante e identifica univocamente l'antidiagonale stessa (e perfino la sua lunghezza, con un minimo di riflessione). Fatto banale, ma forse non ovvio di primo acchito.
Da qui, tutto il resto è in discesa. Non occorre perdere tempo a gestire tutte le combinazioni di casi particolari per tenere gli indici "dentro" la struttura, o ricorrere al solito operatore modulo tuttofare. Si tratta semplicemente di popolare ciascuna antidiagonale, seguendo direzioni adeguatamente alternate, per poi ruotare o specchiare, secondo la specifica istanza del problema, l'intera matrice al termine del lavoro.


EDIT: Prima di fornire ulteriori spunti per una soluzione in C (in fondo non credo ne abbiate bisogno), voglio sottolineare ancora una volta perché APL e J sono i miei linguaggi preferiti per questo genere di cose. Ricordo che pochi anni fa un thread del genere è stato lanciato nella mailing list di J: ne sono scaturite diverse soluzioni di grande fascino, oltre all'occasione di conoscere uno dei tanti episodi meno noti sull'eccezionale figura di Kenneth Iverson, creatore del linguaggio.

Una delle migliori soluzioni generali si configura come segue:
Codice:
($ [: /:@; [: <@|.`</. [: |. i.) 7 8

Dove 7 e 8 sono dei parametri esemplificativi, e rappresentano le dimensioni della matrice generata. Non male, eh? Ghigno
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +175/-11
Scollegato Scollegato

Messaggi: 2515


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #11 inserita:: Febbraio 06, 2012, 09:08:57 pm »

Dato che, per metterla in metafora, non ci si può più schiarire la voce o accennare distrattamente un paio di strofe senza che saltiate nella mia email in mezza dozzina e più a reclamare che vi si canti tutta l'opera...  Felice in breve, a gentile e plurima richiesta, ho dedicato una blog entry a questo argomento.

Già che c'eravate, magari avreste potuto anche dir subito che un tizio su Rosetta Code aveva già attinto al medesimo storico thread richiamato sopra, proponendo le varie soluzioni alternatesi in ML e scrivendo la sua brava paginata di spiegazioni (con una qualità superiore alla media di quel sito) dell'espressione in J: mi sarei risparmiato buona parte dell'incomodo, dedicando magari tempo e spazio ad altri linguaggi esotici di vostro interesse (che so, Moscow ML o Haskell, o magari il solito Python). Comunque sia, divertitevi...  Ghigno
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io?
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page