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");
}