Advertisement
MattyRed99

Es 8.2

Dec 7th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct tratto{
  4.     char colore;
  5.     int punteggio;
  6. }tratto_t;
  7. typedef struct tessera{
  8.     tratto_t oriz,vert;
  9.     int in;
  10. }tessera_t;
  11.  
  12. /*PROTOTIPI*/
  13. tessera_t ruotaTessera(tessera_t t);
  14. tessera_t tessera_void(void);
  15. void salvaTessere(FILE *tiles,int tessere_tot,tessera_t *tessere);
  16. void salvaScacchiera(FILE *board,tessera_t **scacchiera_i,tessera_t *tessere,int R,int C,int *num_scelte);
  17. int disp_sempl(int pos, tessera_t *tessere_val, tessera_t *tessere_sol,
  18.                tessera_t **scacchiera_i,int *mark, int n_tessere_val, int num_scelte, int count,
  19.                int R,int C,int *maxPunti,tessera_t **max_scacchiera);
  20. int rigaValida(tessera_t **scacchiera_i,int i,int C);
  21. int colonnaValida(tessera_t **scacchiera_i,int j,int R);
  22. int calcolaPunteggioRiga(tessera_t **scacchiera_i,int j,int C);
  23. int calcolaPunteggioColonna(tessera_t **scacchiera_i,int i,int R);
  24. void salvaScacchieraMigliore(tessera_t **scacchiera_i,tessera_t **max_scacchiera,int R,int C);
  25.  
  26. int main() {
  27.     FILE *tiles,*board;
  28.     tessera_t *tessere,**scacchiera_i,**max_scacchiera,*tessere_sol,*tessere_val;
  29.     int tessere_tot,R,C,i,j,dim_val=1,num_scelte=0,count,*mark,max_punti=-1;
  30.  
  31.     tiles=fopen("tiles","r");
  32.     board = fopen("board","r");
  33.     if(tiles==NULL||board==NULL)return EXIT_FAILURE;
  34.  
  35.     fscanf(tiles,"%d\n",&tessere_tot);
  36.     tessere = (tessera_t *)malloc(tessere_tot* sizeof(tessera_t));
  37.     salvaTessere(tiles,tessere_tot,tessere);
  38.  
  39.     fscanf(board,"%d %d\n",&R,&C);
  40.     scacchiera_i = (tessera_t **)malloc(R*sizeof(tessera_t *));
  41.     max_scacchiera = (tessera_t **)malloc(R*sizeof(tessera_t *));
  42.     for(i=0;i<C;i++){
  43.         scacchiera_i[i] = (tessera_t *)malloc(C* sizeof(tessera_t));
  44.         max_scacchiera[i] = (tessera_t *)malloc(C* sizeof(tessera_t));
  45.     }
  46.     salvaScacchiera(board,scacchiera_i,tessere,R,C,&num_scelte);
  47.  
  48.     tessere_val=(tessera_t *)malloc(tessere_tot* sizeof(tessera_t));
  49.     /*Conto il numero di tessere disponibili per essere posizionate*/
  50.     for(i=0,j=0;i<tessere_tot;i++){
  51.         if(tessere[i].in==-1){
  52.             dim_val++;
  53.             tessere_val[j++]=tessere[i];
  54.         }
  55.     }
  56.  
  57.     mark = (int *)calloc((dim_val-1),sizeof(int));
  58.     tessere_sol = (tessera_t *)malloc((num_scelte)*sizeof(tessera_t));
  59.     count=disp_sempl(0,tessere_val,tessere_sol,scacchiera_i,mark,dim_val-1,num_scelte,0,R,C,&max_punti,max_scacchiera);
  60.     /*Stampo la scacchiera a punteggio massimo*/
  61.     for(i=0;i<R;i++){
  62.         for(j=0;j<C;j++) {
  63.             printf("%c %d %c %d   ", max_scacchiera[i][j].oriz.colore, max_scacchiera[i][j].oriz.punteggio,
  64.                    max_scacchiera[i][j].vert.colore, max_scacchiera[i][j].vert.punteggio);
  65.         }
  66.         printf("\n");
  67.     }
  68.     printf("Punteggio %d",max_punti);
  69.  
  70.     /*Dealloco vettori e matrici e chiudo i file*/
  71.     fclose(tiles);
  72.     fclose(board);
  73.     free(tessere);
  74.     free(tessere_val);
  75.     free(tessere_sol);
  76.     free(mark);
  77.     for(i=0;i<C;i++) {
  78.         free(scacchiera_i[i]);
  79.         free(max_scacchiera[i]);
  80.     }
  81.     free(scacchiera_i);
  82.     free(max_scacchiera);
  83.     return 0;
  84. }
  85. void salvaTessere(FILE *tiles,int tessere_tot,tessera_t *tessere){
  86.     int i;
  87.     for(i=0;i<tessere_tot;i++){
  88.         fscanf(tiles,"%c %d %c %d\n",&tessere[i].oriz.colore,&tessere[i].oriz.punteggio,
  89.                                    &tessere[i].vert.colore,&tessere[i].vert.punteggio);
  90.         tessere[i].in=-1;
  91.     }
  92.  
  93. }
  94. void salvaScacchiera(FILE *board,tessera_t **scacchiera_i,tessera_t *tessere,int R,int C,int *num_scelte){
  95.      int i,j,t_i,r;
  96.      for(i=0;i<R;i++){
  97.          for(j=0;j<C;j++){
  98.              fscanf(board,"%d/%d",&t_i,&r);
  99.              if(t_i==-1){
  100.                  scacchiera_i[i][j] = tessera_void();/*La scacchiera iniziale presenterà delle tessere vuote con in=-1 nei punti dove andranno inserite quelle nuove*/
  101.                  (*num_scelte)++;
  102.              }
  103.              else{
  104.                  if(r==0){
  105.                      tessere[t_i].in=1;/*Marco quella tessera come parte della configurazione iniziale*/
  106.                      scacchiera_i[i][j] = tessere[t_i];
  107.                  }
  108.                  else {
  109.                      tessere[t_i].in=1;
  110.                      scacchiera_i[i][j]=ruotaTessera(tessere[t_i]);
  111.                  }
  112.              }
  113.          }
  114.      }
  115.  
  116. }
  117. tessera_t ruotaTessera(tessera_t t){
  118.     tratto_t temp;
  119.  
  120.     temp = t.vert;
  121.     t.vert = t.oriz;
  122.     t.oriz = temp;
  123.     return t;
  124. }
  125. int disp_sempl(int pos, tessera_t *tessere_val, tessera_t *tessere_sol,
  126.                tessera_t **scacchiera_i,int *mark, int n_tessere_val, int num_scelte, int count,
  127.                int R,int C,int *maxPunti,tessera_t **max_scacchiera){
  128.     int i,j,k=0,punti=0;
  129.     if (pos >= num_scelte) {
  130.         /*Riempo la matrice con il vettore tessere_sol generato*/
  131.         for(i=0;i<R;i++){
  132.             for(j=0;j<C;j++){
  133.                 if(scacchiera_i[i][j].in==-1) scacchiera_i[i][j]=tessere_sol[k++];
  134.             }
  135.         }
  136.         /*Controllo di validità e calcolo dei punteggi*/
  137.         for(i=0;i<R;i++){
  138.             if(rigaValida(scacchiera_i,i,C)){
  139.                 punti+=calcolaPunteggioRiga(scacchiera_i,i,C);
  140.             }
  141.         }
  142.         for(j=0;j<C;j++){
  143.             if(colonnaValida(scacchiera_i,j,R))punti+=calcolaPunteggioColonna(scacchiera_i,j,R);
  144.         }
  145.         /*Verifica di ottimalità*/
  146.         if(punti>*maxPunti) {
  147.             *maxPunti = punti;
  148.             salvaScacchieraMigliore(scacchiera_i,max_scacchiera,R,C);
  149.         }
  150.         return count+1;
  151.     }
  152.  
  153.     for (i=0; i<n_tessere_val; i++) {
  154.         if (mark[i] == 0) {
  155.             mark[i] = 1;
  156.             /*Marco l'elemento come preso, ricorro senza ruotare la tessera e poi ricorro ruotandola*/
  157.             tessere_sol[pos] = tessere_val[i];
  158.             count = disp_sempl(pos+1, tessere_val, tessere_sol,scacchiera_i,mark,n_tessere_val,num_scelte,count,R,C,maxPunti,max_scacchiera);
  159.             tessere_sol[pos] = ruotaTessera(tessere_val[i]);
  160.             count = disp_sempl(pos+1, tessere_val, tessere_sol,scacchiera_i,mark,n_tessere_val,num_scelte,count,R,C,maxPunti,max_scacchiera);
  161.             mark[i] = 0;
  162.         }
  163.     }
  164.     return count;
  165. }
  166. tessera_t tessera_void(void){
  167.     tessera_t t;
  168.     t.oriz.colore=' ';
  169.     t.oriz.punteggio=-1;
  170.     t.vert.colore=' ';
  171.     t.vert.punteggio=-1;
  172.     t.in=-1;
  173.     return t;
  174. }
  175. int rigaValida(tessera_t **scacchiera_i,int i,int C){
  176.     int j;
  177.     char colore = scacchiera_i[i][0].oriz.colore;/*colore di riferimento*/
  178.     for(j=1;j<C;j++){
  179.         if(scacchiera_i[i][j].oriz.colore!=colore) return 0;
  180.     }
  181.     return 1;
  182. }
  183. int colonnaValida(tessera_t **scacchiera_i,int j,int R){
  184.     int i;
  185.     char colore = scacchiera_i[0][j].vert.colore;/*colore di riferimento*/
  186.     for(i=1;i<R;i++){
  187.         if(scacchiera_i[i][j].vert.colore!=colore) return 0;
  188.     }
  189.     return 1;
  190. }
  191. int calcolaPunteggioRiga(tessera_t **scacchiera_i,int i,int C){
  192.     int j,count=0;
  193.     for(j=0;j<C;j++)count+=scacchiera_i[i][j].oriz.punteggio;
  194.     return count;
  195. }
  196. int calcolaPunteggioColonna(tessera_t **scacchiera_i,int j,int R){
  197.     int i,count=0;
  198.     for(i=0;i<R;i++)count+=scacchiera_i[i][j].vert.punteggio;
  199.     return count;
  200. }
  201. void salvaScacchieraMigliore(tessera_t **scacchiera_i,tessera_t **max_scacchiera,int R,int C){
  202.     int i,j;
  203.     for (i = 0; i < R; i++) {
  204.         for (j = 0; j < C; j++) {
  205.             max_scacchiera[i][j] = scacchiera_i[i][j];
  206.         }
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement