[C] aiuto scacchiera

di il
5 risposte

[C] aiuto scacchiera

Ciao sto impazzendo con questo programma.Questa è la traccia:
Sviluppare un algoritmo elementare di classificazione. 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 posiziona sulla scacchiera, sempre
generando a caso la loro posizione (usando la function rand), 2 nuovi oggetti che
chiameremo centro1 e centro2. L’algoritmo deve visualizzare la scacchiera, mostrando
un ‘ ’ per le caselle non occupate, mostrando una ‘X’ per le caselle occupate dagli
oggetti, un ‘1’ per la casella occupata da centro1 e un ‘2’ per la casella occupata da
centro2. L’algoritmo determina i seguenti due insiemi A e B:
· A è l’insieme degli oggetti che sono più vicini a centro1 piuttosto che a centro2;
· B è l’insieme degli oggetti che sono più vicini a centro2 piuttosto che a centro1.
La “vicinanza” è determinata calcolando la usuale distanza geometrica. Infine
l’algoritmo visualizza di nuovo la scacchiera, ma questa volta indicando con la lettera
‘A’ ognuno degli oggetti dell’insieme A, con la lettera ‘B’ ognuno degli oggetti
dell’insieme B e con la lettera ‘U’ gli eventuali oggetti che hanno uguale distanza sia
rispetto a centro1 che a centro2. La posizione di centro1 è ancora indicata con ‘1’ e
quella di centro2 con ‘2’.

Fino ad ora ho fatto questo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
  int i,r,c,a,b,d,e;
  char X,A,U,B;
  
char scacchiera [][30]= {{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}};
//la scacchiera non è tutta//
                    
                   
  srand(time(NULL)); //qui inserisco le 50 X
  for(i=1;i<51;i++)
  {
     r=rand()%31;
     c=rand()%31;
    
     
     
     if(scacchiera[r][c]==' ') 
     scacchiera[r][c]='X';
     else i--;
     }
     
      srand(time(NULL)); //qui inserisco il numero 1
  for(i=0;i<1;i++)
  {
     r=rand()%31;
     c=rand()%31;
    
    
     if(scacchiera[r][c]==' ') 
     scacchiera[r][c]='1';
     else i--;
      
     }
      srand(time(NULL)); //qui il numero 2
  for(i=0;i<1;i++)
  {
     r=rand()%31;
     c=rand()%31;
     //printf("Il numero 2 ha come coordinate: %d %d \n",r,c);
     
     if(scacchiera[r][c]==' ') 
     scacchiera[r][c]='2';
     else i--;
     }
     printf("\n\n");

  for(r=0;r<30;r++){
                    for(c=0;c<30;c++)
printf("%c",scacchiera[r][c]);
printf("\n");
}
adesso la parte che non so fare è quella di determinare i 2 insiemi A e B! mi potete dare un mano per piacere?

5 Risposte

  • Re: [C] aiuto scacchiera

    Secondo me devi partire diversamente. Avere uno struct x ogni oggetto definito come:
    
    typedef enum {
      NEUTRO = 'X',
      VICINO_A = 'A',
      VICINO_B = 'B',
      UGUALE = 'U'
    }lettera_da_piazzare;
    
    struct
    {
     lettera_da_piazzare lettera; //X,A,B,U
     int x;
     int y;
     int distanza;
    }oggetto;
    
    e poi calcolare questi dati. x e y ti viene dal rand, la distanza è il minimo tra le due distanze (distanza con 1 e distanza con 2). Trovando il minimo puoi piazzare anche la lettera. Tutto il resto è un accumulo di dati con lo stesso enum tipo: Se vuoi sapere tutto l'insieme A basta vedere quali struct hanno A come lettera.
  • Re: [C] aiuto scacchiera

    Così come ho fatto io non va bene?
  • Re: [C] aiuto scacchiera

    Mi dici come farai a tenere traccia delle distanze x ogni oggetto?
  • Re: [C] aiuto scacchiera

    Infatti non so come fare a calcolare la distanza!
    mi potresti spiegare meglio il modo in cui lo vuoi fare tu?perchè non ho capito molto bene
  • Re: [C] aiuto scacchiera

    Io non lo voglio fare infatti non lo sto facendo. Ti sto dando un consiglio su come si potrebbe risolvere. Pensa al oggetto come una cella che contiene informazioni. Una di queste informazioni è la distanza da un punto. pensalo nel piano cartesiano. la distanza di un punto dal punto 0 è il vettore che unisce sti due punti e sto vettore si chiama ipotenusa. avendo x e y dei due punti puoi trovare la distanza con la formula:
    
    distanza = radice_quadra((x-x0)^2 + (y-y0)^2);
    
    dove x e y sono le coordinate del tuo oggetto e x0 e y0 quelle del punto 1 oppure del punto 2. La distanza minima ti dara la lettera da applicare all'oggetto. Faccendo un ciclo che controlla lo stato di questa lettera sarai capace a trovare tutti gli oggetti dell'insieme A e tutti gli oggetti dell'insime B, oltre ai oggetti di distanza uguale.
Devi accedere o registrarti per scrivere nel forum
5 risposte