PDA

View Full Version : Gestione matrice toroidale


pumppkin
24-05-2005, 18:34
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....

gokan
25-05-2005, 10:06
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:


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;

marcus81
28-05-2005, 10:59
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 ;)