Algoritmo Ricorsivo Scacchiera ( C )

di il
3 risposte

Algoritmo Ricorsivo Scacchiera ( C )

Ciao ragazzi, sto lavorando ad un progetto personale inerente ad un programma in C. La traccia è questa:

Si consideri un array 2D nxn, con n=32, in cui ogni casella può essere bianca
(rappresentata da uno spazio ‘ ‘) o nera (rappresentata da una ’X’). All’inizio l’array
è costituito solo da caselle nere. L’algoritmo esamina m=6 volte la scacchiera.
Durante ogni passo aggiorna lo stato di tutte le caselle usando un criterio di
suddivisione nel seguente modo: al primo passo l’array 2D viene visto come
costituito da 4 blocchi, ognuno di 16x16 caselle; al secondo passo, ogni blocco di
16x16 è visto come costituito da 4 blocchi di 8x8 caselle; e così via. La regola di
suddivisione è la seguente: quando un blocco ‘grande’ nero viene suddiviso in 4
blocchi ‘più piccoli’ allora i blocchi ‘piccoli’ diagonali vengono marcati con ‘D’ e il
blocco piccolo in alto a destra diventa bianco o marchiato con ‘A’; quando un blocco
‘grande’ bianco viene suddiviso in 4 blocchi ‘più piccoli’ allora tutti i blocchi
‘piccoli’ rimangono bianchi. L’algoritmo visualizza tutto l’array 2D al temine di ogni
passo. Sviluppare due versioni dell’algoritmo, una iterativa e l’altra ricorsiva. Per
questo esercizio è necessario solo un test per ogni versione

Ho già provato a sviluppare il codice, ma non capisco se rispecchia ciò che la traccia chiede. Qualcuno potrebbe aiutarmi ed eventualmente correggermi su qualche sbaglio ?

PS: (dovrei organizzare questo codice in function/procedure)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 32
void ricerca(char [N][N],int);
void cerca_in_linea(char [N][N],int,int,int);
void libera_sottomatrice(char [N][N],int,int,int);
void compila_array(char [N][N],int,char); //inizializza le righe e le colonne della matrice
void stampa_array(char[N][N],int);

void main (){
char matrice[N][N];
compila_array(matrice,N,('X')); //richiamo la procedura compila_array
printf("\n\t\t\tIterazione 1\n\n");
stampa_array(matrice,N);    //richiamo la procedura stampa_array
system("PAUSE");
system("cls");
ricerca(matrice,1);         //richiamo la procedura ricerca
}

void ricerca(char matrice[N][N],int ciclo){ //
int i=0;
int j,M,x,y;
M=N /(pow(2,ciclo));
j=M;
while(i<N){
cerca_in_linea(matrice,i,j,M);
//j=M;
i=(i+(2*M));
}
if (ciclo==1)
{
for(x=0; x<N/2; x++)
{
for(y=0; y<N/2; y++)
matrice[x][y]='D';
}
for(x=N/2-1; x<N; x++)
{
for(y=N/2-1; y<N; y++)
matrice[x][y]='D';
}
for(x=0; x<N/2; x++)
{
for(y=N/2; y<N; y++)
matrice[x][y]=' ';
}
for(x=N/2; x<N; x++)
{
for(y=0; y<N/2; y++)
matrice[x][y]='X';
}
}


printf("\n\t\t\tIterazione %d\n\n",ciclo+1);
stampa_array(matrice,N);


if(ciclo==1)
{ for(x=16; x<N; x++)
{
for(y=0; y<N/2; y++)
{
if(x<=31 && y<=23)
matrice[x][y]='D';
}
}
}


if(ciclo==1)
{
for(x=24; x<N; x++)
{
for(y=0; y<N/4; y++)
matrice[x][y]='X';
}
}


if(ciclo==2)
{
for(x=24; x<28; x++)
{
for(y=0; y<N/8; y++)
matrice[x][y]='D';
}
for(x=28; x<N; x++)
{
for(y=4; y<8; y++)
matrice[x][y]='D';
}
}


if(ciclo==3)
{
for(x=28; x<30; x++)
{
for(y=0; y<2; y++)
matrice[x][y]='D';
}
for(x=30; x<N; x++)
{
for(y=2; y<N/8; y++)
matrice[x][y]='D';
}
}


if(ciclo==4)
{
matrice[30][0]='D';
matrice[31][1]='D';
}
system("PAUSE");
system("cls");


    if(M>1)
ricerca(matrice,(ciclo+1));
}


void cerca_in_linea(char matrice[N][N],int i,int j,int M)
{
while(j<=N)
{
if(matrice[j]!=' ')
libera_sottomatrice(matrice,i,j,M);
j=(j+(2*M));
}
}


void libera_sottomatrice(char matrice[N][N],int i,int j,int size)
{
int l,m;
for(l=i;l<(size+i);l++)
{
for(m=j;m<(size+j);m++)
{
matrice[l][m]=' ';
}
}
}

void compila_array(char matrice[N][N],int n,char C)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
matrice[N][N]=C;
}
}

void stampa_array(char matrice[N][N],int n)
{
int i,j;
printf("+----------------------------------------------------------------+\n");
for(i=0;i<n;i++)
{
printf("|");
for(j=0;j<n;j++)
printf("%c ",matrice[j]);
printf("|");
printf("\n");
}
printf("+----------------------------------------------------------------+\n");
}

3 Risposte

  • Re: Algoritmo Ricorsivo Scacchiera ( C )

    Ciao, per quanto riguarda il codice non mi compila, e ciò sia perché stai utilizzando void main() al posto di int main(), sia perché nella funzione cerca_in_linea(), alla riga 130, stai confrontando un char con un puntatore.
    Inoltre, al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare la spaziatura e l'indentazione.

    Per quanto riguarda la traccia invece, l'ho letta, ma sinceramente non credo di aver ben capito cosa chieda... tu come l'hai interpretata? Potresti fare un esempio pratico?


    P.S.
    Non so cosa tu intenda con "progetto personale", ma se non si tratta di un esercizio scolastico da svolgere e tenendo conto del fatto che, da quello che ho capito, anche tu non hai la certezza di aver compreso la traccia fino in fondo, ti consiglio di concentrarti su programmi in cui hai ben chiaro quello che devi fare e quello che deve essere il risultato finale.
  • Re: Algoritmo Ricorsivo Scacchiera ( C )

    E' un compito che devo svolgere poichè mi hanno assegnato 10 tracce (8/10 già completate).
    Questa è una delle due incomplete in quanto ci sono dubbi a cui non riesco a trovare una risposta concreta. Ci sto lavorando da circa 2 settimane e con il tempo ho cercato di migliorare sempre di più il programma.

    Per quanto riguarda il void main (), hai perfettamente ragione ! Errore mio.

    Per il resto non riesco a capire dove sbaglio in quanto mi risulta molto confusa anche la traccia.
    Probabilmente sarò io che con poca esperienza in programmazione non riesco a trovare una soluzione adeguata alla finalità del programma.

    Una volta trovato e risolto l'errore, dovrei concentrarmi sull'organizzazione del programma in function/procedure poichè il prof. ha dichiarato esplicitamente di voler il main pulito e il programma organizzato in file .c e .h
  • Re: Algoritmo Ricorsivo Scacchiera ( C )

    antobonacci ha scritto:


    Per quanto riguarda il void main (), hai perfettamente ragione ! Errore mio.
    Ok, ma per quanto riguarda l'altro errore? Ossia:

    Nippolo ha scritto:


    nella funzione cerca_in_linea(), alla riga 130, stai confrontando un char con un puntatore.

    antobonacci ha scritto:


    Per il resto non riesco a capire dove sbaglio in quanto mi risulta molto confusa anche la traccia.
    Probabilmente sarò io che con poca esperienza in programmazione non riesco a trovare una soluzione adeguata alla finalità del programma.
    Secondo me non ha molto senso dire "non riesco a capire dove sbaglio" se non si è capita la traccia e quindi non si sa bene dove si vuole andare a parare...
    In ogni caso le strade possibili sono le seguenti:
    - chiedere un chiarimento al prof o agli altri studenti;
    - aspettare l'intervento di qualche utente del forum che riesca a capire la traccia;
    - spiegarci la tua interpretazione, magari con l'ausilio di un esempio pratico.
Devi accedere o registrarti per scrivere nel forum
3 risposte