[Algo] Esercizio BackTracking

Messaggioda Paolovox » 26/06/2016, 16:43

Dare lo pseudo-codice di un algoritmo che, preso in input un intero n, stampi tutte le matrici n×n con valori in {a, b, c} tali che due elementi adiacenti (per riga o colonna) abbiano valori differenti. Ad esempio se n = 2, le matrici da stampare sono:
Codice:
ab  ab  ab  ac  ac  ac  ba  ba  ba  bc  bc  bc  ca  ca  ca  cb  cb  cb
ba  bc  ca  ca  cb  ba  ab  ac  cb  cb  ca  ab  ac  ab  bc  bc  ba  ac


La complessità dell'algoritmo deve essere O(n2S(n)), dove S(n) è il numero di matrici da stampare.

La mia idea sarebbe quella di non memorizzare l'array in un array bidimensionale, ma in un array monodimensionale.
Lo pseudocodice potrebbe essere:

Codice:
Matrix( n:lato matrix , h: lunghezza pref. , S: array )
   if nxn == h then
      print(S , n)
   else
      for i<-1 to nxn do
         for y in {a,b,c} do
            if ( isSafe( S , y ) ) then
               S[h+1] <- y
               Matrix( n, h+1, S )


Codice:
print( S:array, n: dimensione lato )
   for i<-1 to nxn do
      print(S[i])
      if ( i%n == 0 ) then print(\n)


Adesso mi manca la procedura isSafe per controllare che è possibile aggiungere l'elemento in quella posizione.
Può andare come algoritmo? Rispetta la complessità ?

Buona domenica :smt023
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
Paolovox
Average Member
Average Member
 
Messaggio: 272 di 620
Iscritto il: 13/06/2014, 19:44

Re: [Algo] Esercizio BackTracking

Messaggioda apatriarca » 28/06/2016, 10:26

Siccome stai inserendo i valori una riga per volta è sufficiente guardare il valore precedente sulla riga (stando attento al caso in cui sia nella prima colonna) e quello precedente nella colonna. Mi sembra possa andare bene.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4297 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Algo] Esercizio BackTracking

Messaggioda Paolovox » 29/06/2016, 12:26

Penso così possa andare.

Codice:
isSafe( S: array stringa, y: lettera da inserire, h: index, n: lato matrix ) -> boolean
 
   boolean f = true

   if h>1 and S[h-1] == y then f = false
   else if h>n and S[h-n] == y then f = false

   return false


La chiamata ad isSafe nella funzione matrix sarà:
Codice:
isSafe(S,y,h+1,n)


Vanno bene le condizioni? Avrei potuto anche congiungerle con un or.
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
Paolovox
Average Member
Average Member
 
Messaggio: 277 di 620
Iscritto il: 13/06/2014, 19:44

Re: [Algo] Esercizio BackTracking

Messaggioda apatriarca » 30/06/2016, 10:51

Direi che devi restituire \(f\). Se no così sarà sempre falsa..
apatriarca
Moderatore
Moderatore
 
Messaggio: 4303 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Algo] Esercizio BackTracking

Messaggioda Paolovox » 30/06/2016, 12:54

Chiedo venia è stato un errore di distrazione. Si conclude quindi con
Codice:
return f
.
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
Paolovox
Average Member
Average Member
 
Messaggio: 278 di 620
Iscritto il: 13/06/2014, 19:44


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite