Algoritmo scacchiera 30x30

di il
19 risposte

Algoritmo scacchiera 30x30

Salve ragazzi, potreste darmi una mano a risolvere questo esercizio? Mi sono bloccato e non riesco ad andare avanti.

Ecco il testo dell'esercizio:

Si vuole sviluppare un algoritmo di calcolo del centroide. L’algoritmo considera una scacchiera di 30x30 caselle e dispone a caso (usando la function rand) 50 oggetti (la posizione è una coppia di numeri interi). L’algoritmo deve visualizzare la scacchiera, mostrando un  ‘  ’ per le caselle non occupate e mostrando una ‘X’ per le caselle occupate dagli oggetti.  L’algoritmo determina il centroide dell’insieme dei 50 oggetti: il centroide è un punto della scacchiera che ha per ascissa l’intero più vicino alla media delle ascisse di tutti gli oggetti e per ordinata l’intero più vicino alla media delle ordinate di tutti gli oggetti. L’algoritmo deve visualizzare di nuovo la scacchiera, indicando, oltre alle caselle vuote e a quelle occupate, anche la posizione del centroide (indicandola con la lettera ‘C’). Infine, l’algoritmo calcola e visualizza la distanza di ognuno degli oggetti dal centroide, e determina e visualizza  sia la minima distanza (indicando anche la posizione dell’oggetto a minima distanza) sia la massima distanza (indicando anche la posizione dell’oggetto a massima distanza).
Questo è ciò che sono riuscito a fare:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

void main(){
int i,j,nx,ny;
char scacchiera[][30]={
    {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
    {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
   //continua cosi per 30 righe.. le ho eliminate qui nel codice per questioni di spazio
    };
srand(time(NULL));

for(i=1;i<=50;i++){
    nx = rand()%31;
    ny = rand()%31;
    scacchiera[nx][ny]='X';
}
printf("\n\n");

for(i=0;i<=30;i++){
    for(j=0;j<=30;j++){
        printf("%c",scacchiera[i][j]);
    }
printf("\n");

}
}
anche se quando vado a compilare e lanciare il programma, non mi stampa le 50 X ma all'incirca una 30ina..

come posso fare?

19 Risposte

  • Re: Algoritmo scacchiera 30x30

    Ultra date le definizioni ovvio che si parli di c.

    ti posso dare una line di guida,anche se non era proprio malvagio il tuo codice.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    
    #define MAPPA_SIZE 30
    #define NUMERI 50
    int main()
    {
        //init seme
        srand((unsigned)time(NULL));
    
        //creo ed azzero mappa
        char mappa[MAPPA_SIZE][MAPPA_SIZE];
    
        int iy,ix;
        for (iy = 0; iy < MAPPA_SIZE ; iy++)
            for (ix = 0; ix < MAPPA_SIZE ; ix++)
                mappa[iy][ix] = ' ';
    
        //setto valori casuali
        int i;
        for (i = 0 ; i < NUMERI ; i++)
        {
            iy = rand() % MAPPA_SIZE;
            ix = rand() % MAPPA_SIZE;
            mappa[iy][ix] = 'X';
        }
    
    
        //disegno mappa
        //linea alta
        printf("+");
        for (i = 0; i < MAPPA_SIZE ; i++)
            printf("-");
        printf("+\n");
    
        //mappa
        for (iy = 0; iy < MAPPA_SIZE ; iy++)
        {
            printf("|");
            for (ix = 0; ix < MAPPA_SIZE ; ix++)
                printf("%c",mappa[iy][ix]);
            printf("|\n");
        }
    
        //linea bassa
        printf("+");
        for (i = 0; i < MAPPA_SIZE ; i++)
            printf("-");
        printf("+\n");
    
        return 0;
    }
    
    [edit ho letto tardi]
    ma le cinquanta crocette ci devono essere tutte?
    perchè altrimenti bisogna modificare l'algoritmo di estrazione cosi:
    
        //setto valori casuali
        int i;
        for (i = 0 ; i < NUMERI ; i++)
        {
            do
            {
                iy = rand() % MAPPA_SIZE;
                ix = rand() % MAPPA_SIZE;
            }while (mappa[iy][ix] == 'X');
            mappa[iy][ix] = 'X';
        }
    
  • Re: Algoritmo scacchiera 30x30

    Prima che qualcuno ti scriva la soluzione completa senza che tu ci ragioni un attimo su, chiediti intanto se gli indici dell'array sono corretti.

    Ricorda che gli indici vanno da da 0 al massimo-1.

    Ovvero, se hai un indice massimo [50] questo va da 0 a 49 e se hai un indice massimo [30] questo va da 0 a 29.

    Quindi, un ciclo for

    i=1;i<=50;

    che va da 1 a 50 *non va bene* e neanche un ciclo

    i=0;i<=30
    j=0;j<=30

    che va da 0 a 30.
  • Re: Algoritmo scacchiera 30x30

    Cambia titolo thread, pena chiusura dello stesso
  • Re: Algoritmo scacchiera 30x30

    Oregon ti sono mancato?
  • Re: Algoritmo scacchiera 30x30

    vbextreme ha scritto:


    oregon ti sono mancato?
    Non sai quanto ... ci mancavi solo tu alla gara del gioco

    "te lo scrivo io al posto tuo e tu non impari nulla" ...
  • Re: Algoritmo scacchiera 30x30

    "te lo scrivo io al posto tuo e tu non impari nulla" ...
    Era abbastanza scritto bene,alla fine gli ho corretto l'overflow e gli ho mostrato come si estrae senza ripetizioni.Niente pappa pronta,Solo una linea guida,mancano parecchie cose da implementarle, e sta a lui decidere come dove quando e perchè.
    Ogni tanto un pò di codice aiuta piu che tanto acqua,....,acqua,.....,fuochino,.........,fuoco.
    Non sai quanto ... ci mancavi solo tu alla gara del gioco

    Scusa ma con chi ti saresti arrabbiato se no?
  • Re: Algoritmo scacchiera 30x30

    Innanzitutto ringrazio tutti per avermi dato le dritte per proseguire..

    skynet ha scritto:


    Cambia titolo thread, pena chiusura dello stesso
    ho corretto bene?

    oregon ha scritto:


    Prima che qualcuno ti scriva la soluzione completa senza che tu ci ragioni un attimo su, chiediti intanto se gli indici dell'array sono corretti.

    Ricorda che gli indici vanno da da 0 al massimo-1.

    Ovvero, se hai un indice massimo [50] questo va da 0 a 49 e se hai un indice massimo [30] questo va da 0 a 29.

    Quindi, un ciclo for

    i=1;i<=50;

    che va da 1 a 50 *non va bene* e neanche un ciclo

    i=0;i<=30
    j=0;j<=30

    che va da 0 a 30.
    scusa oregon, quindi il ciclo che va da 1 a 50, devo farlo partire da 0?
    ho il cervello fuso
  • Re: Algoritmo scacchiera 30x30

    Quel ciclo serve solo a contare gli oggetti, la sua variabile non viene usata come indice e quindi può andare bene anche come è scritto.

    Gli altri due (che vanno da 0 a 30) non vanno bene.

    E non va bene neanche

    nx = rand()%31;

    perché sarebbe compresa tra 0 e 30 e non va bene.
  • Re: Algoritmo scacchiera 30x30

    E che c'entra srand? Va usato solo una volta all'inizio ...
  • Re: Algoritmo scacchiera 30x30

    Penso che lui voglia intendere che srand non genera sempre sequenze casuali..
    forse perchè quando si usa srand con time, genera numeri casuali in base all'orario del pc
  • Re: Algoritmo scacchiera 30x30

    Però se immetti il seed da tastiera i numeri sono casuali..
  • Re: Algoritmo scacchiera 30x30

    Non credo che il problema di questo thread sia la srand ... così si va OT ...
  • Re: Algoritmo scacchiera 30x30

    Ultra togliti pure gli occhiali,il codice che hai postato è un concentrato di confusione.


    Potevi almeno partire dalla base che avevo postato e proseguire da li.
  • Re: Algoritmo scacchiera 30x30

    Nella programmazione il risultato non giustifica i mezzi.
    Tra un mese se riguardi quel codice perderai almeno un'ora per capire cosa fa.
Devi accedere o registrarti per scrivere nel forum
19 risposte