Witam, czy mógłby mi ktoś pomoc, mianowicie nie mam już pomysłu na zliczanie najszybszej 'lodygi' osiągającej wysokość, obecnie zlicza pierwsza drogę wzrostu. I druga prośba o pomoc z wypisywaniem, ponieważ mam problem z wypisywaniem tych samych poziomów w jednym rzedzie
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BAD_ALLOC 123
enum TYP { LISC = 0, GALAZ, NIC }; // typ wyliczeniowy, sluzacy do określenia czym jest dany element, NIC -nic, które zostało jeśli wylosowalo się mniej niż 5 elementow
struct cale_drzewo
{
enum TYP coto[ 5 ];
struct cale_drzewo* dz1[ 5 ]; //tablica 5elmentowa wskaznikow ('nowego punktu')
int poziom; // poziom wzrostu drzewa, odpowiadający kolejnym metrom
};
typedef struct cale_drzewo DRZEWO;
// zmienne globalne
int miesiace = 0;
int pz_konsoli = 0;
int koniec = 0;
//deklaracje funkcji
void rosnij( DRZEWO **korzen, int metry, int level, int* tab );
int losuj( int min, int max );
//void rysuj( DRZEWO *korzen );
int main( void )
{
int ile_metrow = 6;
int i;
DRZEWO *korzen = NULL;
/*
scanf( &ile metrow );
int* tab =(int*)malloc(sizeof( int ) * ile_metrow );
*/
int tab[ 5 ] = { 0, 0, 0, 0, 0 };
rosnij( &korzen, ile_metrow, 0, tab );
miesiace = pz_konsoli;
for( i = 0; i < ile_metrow; i ++ )
{
miesiace -= tab[i];
if( tab[i] != 0 ) miesiace += 1;
}
//miesiace += ile_metrow;
//11miesiace = pz_konsoli - tab[0] - tab[ 1]-tab[2]-tab[3]-tab[4] + 5; // to zrobic w forze
/***** if ( suma == 0 ) na ostatnil levelu printf( "drzeweo nie osiagnelo wysokosci" ) ; */
printf( "Drzewo osiagnelo wysokosc w %d miesiecy. \n" , miesiace );
system("PAUSE");
return 0;
}
void rosnij( DRZEWO **korzen, int metry, int level, int* tab )
{
if( level == metry ) //warunek konczacy zapetlanie, czyli drzewo osiaga swoja wysokość (kazda lodyga)
{ koniec =1;
return;
}
int suma = 0; //zmienna sprawdzajaca 'same liscie'
int i, j;
if( *korzen == NULL ) //dynamiczna alokacja pamięci dla kolejnych elementow
{
*korzen = ( DRZEWO* )malloc( sizeof( DRZEWO ) );
if( *korzen == NULL ) exit( BAD_ALLOC );
(*korzen)->poziom = level; //na którym poziomie znajduje się punkt wzrostu
}
int ile_nowych = losuj( 0, 5 ); //losuje ilość elementow
printf( "%d ", (*korzen)->poziom );
for( i = 0; i < ile_nowych; i++ )
{
( *korzen )->coto[ i ] = losuj( 0, 1 ); //losuje czym jest element
if( (*korzen )->coto[ i ] == GALAZ ) printf( "| " ); //jeśli galaz wypisuje |
else printf( "& "); //lisc &
suma += (*korzen )->coto[ i ];
}
printf( "\n" );
for( i = ile_nowych; i < 5; i++ ) // przypisanie wolnym miejscom NCI
( *korzen )->coto[ i ] = NIC;
if ( suma == 0 && ile_nowych != 0 ) //mozliwosc wyrosniercia nica, sprawdzaie czy same liscie
{
printf( " stop, same liscie\n" ); //koniec danej 'łodygi'
return;
}
pz_konsoli++;
if( ile_nowych != 0 )
{
tab[ level ]++;
level++; //poziom drzewa
for( j = 0; j < ile_nowych; j++ )
{
if( ( *korzen )->coto[ j ] == GALAZ )
{
(*korzen)->dz1[ j ] = ( DRZEWO* )malloc( sizeof( DRZEWO ) );
((*korzen)->dz1[ j ])->poziom = level; // na którym poziomie znajduja się pojedyncza galaz
rosnij( &((*korzen)->dz1[ j ]), metry, level, tab ); // dalsze losowanie z kolejnych punktow
}
}
}
if( ile_nowych == 0 ) //petla losujaca ponownie jeżeli z punktu wyrosło NIC
{
rosnij( korzen, metry, level, tab );
}
}
int losuj( int min, int max )
{
srand( time( NULL ) );
sleep( 150 ); ); //zwieksza odstep czasu miedzy losowaniami, wieksza losowość, możliwość zaobserowania wzrostu (pod windows)
return ( ( rand() % ( max + 1 ) ) + min );
}