Visualizzazione dei risultati da 1 a 1 su 1
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2014
    Messaggi
    3

    Problema con algoritmo ricorsivo [backtracking]

    Ciao ragazzi , ho dei problemi con questo algoritmo ricorsivo..spero che qualche anima pia possa aiutarmi.
    Allora il testo dell'esercizio è il seguente:
    Fornire lo pseudocodice di un algoritmo che preso in input un intero n stampi tutte le matrici contenenti le lettere ={a,b,c} nxn tali che le a precedono le b che precedono le c. ad esempio per n=2 l'output deve essere :
    output:
    aa aa aa ab ab bb aa aa ac cc bb bb bc bc ab ab ac
    aa ab bb ab bb bb ac cc ac cc bc cc bc cc bc cc bc

    Vi posto anche il mio codice, è scritto in java ,è semplicemente una funzione statica.
    codice:
    public class EsercizioNovBT {
        public static void main(String[] args) {
            int n=2 , i , j;
            char[][] m = new char [n][n];
            /* array di booleani che indicano se esiste una b o una c nella riga/colonna i/j ad esempio:
            isBR[i] è true se è stata messa una b nella riga i , isBC[j] è true se è stata messa una b nella colonna j ,stesso    discorso per gli altri array*/
            boolean[] isBR = new boolean [n];
            boolean[] isBC = new boolean [n];
            boolean[] isCR = new boolean [n];
            boolean[] isCC = new boolean [n];
           /* inizializzazione dei vettori e della matrice */
            for(i=0;i<n;i++)
                isBR[i]=false;
            for(i=0;i<n;i++)
                isBC[i]=false;
            for(i=0;i<n;i++)
                isCR[i]=false;
            for(i=0;i<n;i++)
                isCC[i]=false;
            for (i=0 ; i<n ; i++)
                for(j=0 ; j<n ;j++)
                    m[i][j]='d';
            i=0;j=0;
            scriviSuM(m,isBR,isBC,isCR,isCR,i,j,n);
    
    
    
        }
    
    
    
        static void scriviSuM(char[][]M , boolean[] isRB,boolean[] isCB,boolean[] isRC,boolean[] isCC,int i, int j , int n)
        {
            if(i==n)
            {
                for (int r=0 ; r<n ; r++)
                {
                    for(int c=0 ; c<n ;c++)
                    {
                        System.out.print(M[r][c]);
                    }
                    System.out.print("\n");
                }
                System.out.println();
            }
            else
            {
                if(j==n)
                {
                    j=0;
                    scriviSuM(M,isRB,isCB,isRC,isCC,i+1,j,n);
                }
                else
                {
    
                        if (! (isRC[i]) && !(isCC[j])) // se non ci sono delle c
                        {
                            if( ! (isRB[i]) && !(isCB[j]) )  // se non ci sono già delle b e delle c allora puoi prendere a
                            {
                                M[i][j]='a';
                                scriviSuM(M,isRB,isCB,isRC,isCC,i,j+1,n);
                            }
    
                            isRB[i]=isCB[j]=true;
                            M[i][j]='b'; // se non ci sono  c posso comunque prendere delle b
                            scriviSuM(M,isRB,isCB,isRC,isCC,i,j+1,n);
                            isRB[i]=isCB[j]=false;
                        }
                        isRC[i]=isCC[j]=true;
                        M[i][j]='c'; // posso sempre prendere c
                        scriviSuM(M,isRB,isCB,isRC,isCC,i,j+1,n);
    
                }
    
    
            }
        }
    }
    ora l'output è:
    aa
    aa

    aa
    ab

    aa
    ac

    aa
    bc

    aa
    cc

    ab
    cc

    ac
    cc

    bc
    cc

    cc
    cc

    Quello che stampa è corretto...ma è solo una parte di quello che dovrebbe stampare...evidentemente taglio troppo lo spazio di ricerca.

    Ora oltre a farmi capire cosa sbaglio in questo esercizio specifico , mi piacerebbe che qualcuno possa darmi delle dritte su come risolvere i problemi con la tecnica del backtracking.
    Grazie in anticipo
    Ultima modifica di xeno92; 30-12-2014 a 18:10

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.