|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Feb 2005
Messaggi: 295
|
Gestione matrice toroidale
vado subito al dunque: data una griglia nXn gemme rosse, determinare il minor numero di mosse che consenta di colorare in verde il maggior numero di gemme. una mossa effettuata su una gemma ne cambia il colore assieme alle 4 gemme adiacenti, ovvero cambia il colore rosso nel colore verde(o viceversa) per tutte e 5 le gemme contemporaneamente.
es. (colorando elemento in posizione 13) 00000 00100 01110 00100 00000 infine le gemme oltre la griglia dovrebbe rientrare in gioco dal lato opposto da cui sono uscite (la griglia è toroidale). es. (effettuando una mossa sul primo elemento) 11001 10100 01110 00100 10000 Il mio problema è che non riesco a trovare un modo per fare una mossa nella prima e ultima colonna e riga della matrice....il professore ha suggerito di lavorare con la funzione mod ma non so come utilizzarla (il programma è in matlab e la matrice viene letta per colonne).... se qualcuno riesce a trovare un modo semplice per fare tutti i tipi di mosse mi è di grande aiuto.... Ultima modifica di pumppkin : 24-05-2005 alle 17:40. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Palermo
Messaggi: 4913
|
Inizialmente tutte le 25 gemme sono rosse (metto a 0 nella matrice):
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 La matrice la numero per colonne con indice: 1 6....21 2 7....... 3 8....... 4 . . . . 5 . . . 25 Se io estraggo l'indice 13 si ha la matrice (metto a 1 le gemme colorate di verde): 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 Se dopo estraggo l'indice 1 si avrà: 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 0 Ossia, siccome in posizione 1 non c'è un "vicino" sinistro, vado a prendere l'elemento dal lato opposto, ossia quello di posto 21. Stesso discorso, perchè in pos 1 non c'è il "vicino" di sopra, e quindi metto un 1 in pos. 5 Sarebbe utile trovare un algoritmo che riesca ad estrarre tutti i vicini in modo semplice, ad esempio io ho scritto una parte di codice che gestisce la prima colonna, ci sono tanti csi particolari, pensavo di scrivere del codice per ognuno dei 4 bordi, m risulta davvero dispendioso; ad esempio: Codice:
function grigl= mossa( x, grigl )
dim=size(grigl,1);
if isempty(find(x==grigl(:,1)))==0 %cioè se x = ad un numero nella prima colonna della griglia
if (x==1)
if (grigl(x)==0)
grigl(dim)=1;
else
grigl(dim)=0;
end;
else
if (x==dim)
if (grigl(1)==0)
grigl(1)=1;
else
grigl(1)=0;
end;
end;
else
if (grigl(x)==0) % se il pixel è già a zero
%lo rimettiamo a rosso
grigl(x-1)=1;
grigl(x+dim)=1;
grigl(x+1)=1;
grigl(dim*dim - dim)=1;
else %se il pixel è a uno
grigl(x-1)=0; %colora il pixel di verde
grigl(x+dim)=0;
grigl(x+1)=0;
grigl(dim*dim - dim)=0;
end
end
else
non si trova nella prima colonna/bordo, dobbiamo usare un altro metodo;
__________________
Sun Certified Java Programmer - Sun Certified Web Component Developer - Sun Certified Business Component Developer |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2001
Città: Partinico(PA)-Torino
Messaggi: 2885
|
Se lavorate con i 2 indici viene molto più semplice:
se il pixel centrale ha coordianate (i,j): sx-> (i,((j+N-2)%N)+1); dx-> (i,(j%N)+1); alto-> (((i+N-2)%N)+1,j) basso-> ((i%N)+1,j) dove "N" è la dimensione della matrice e "%" è l'operatore modulo vi ricordo che in MatLab a%b si scrive mod(a,b) bye
__________________
Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4 Auto e moto d'epoca
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:33.











Main: Barton 2500@3200+ Asus A7N8X-dlx 2*512 DDRPowercolor 9800Pro Maxtor 80GB sATA + Seagate 160GB pATA LCD Acer AL1721 Epson C62 Antec T.P. 430w Tin.it ADSL Muletto: Pentium4 1800 Notebook: Idea Progress P4








