Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. int leggiFile(int **p_freccie);
  6. int calcolaScambi(int *freccie, int delimS, int delimD);
  7. int BottomUp(int N, int *freccia, FILE* fp);
  8. void display(int** freccie, int **s, int delimS, int delimD, FILE* fp);
  9. void allocaMatrici(int ***p_matr, int ***p_s, int N);
  10.  
  11.  
  12.  
  13. int main(){
  14.  
  15. FILE *fp = fopen("output.txt", "w");
  16. int nFreccie, *freccie, res;
  17.  
  18. nFreccie = leggiFile(&freccie);
  19.  
  20. res = BottomUp(nFreccie, freccie, fp);
  21.  
  22. fprintf(fp, "\n\n in totale sono state invertite: %d freccie\n\n", res);
  23. }
  24.  
  25. int leggiFile(int **p_freccie){
  26.  
  27. FILE *fpx = fopen("input.txt", "r");
  28. int nFreccie, i;
  29. int *tmp;
  30.  
  31. fscanf(fpx,"%d",&nFreccie);
  32. tmp = malloc(nFreccie * sizeof(int));
  33.  
  34. for(i=0;i<nFreccie;i++)
  35. fscanf(fpx,"%d",&tmp[i]);
  36.  
  37. *p_freccie=tmp;
  38. return nFreccie;
  39. }
  40.  
  41. void stampaFreccie(int *freccie, int delimS, int delimD, FILE* fp){
  42.  
  43. int k, i;
  44.  
  45. k = (delimD - delimS+1)/2;
  46.  
  47. for(i=delimS;i<k+delimS;i++){
  48. if(freccie[i]==1)
  49. fprintf(fp,"%d ", i);
  50. }
  51. for(i=k+delimS;i<=delimD;i++){
  52. if(freccie[i]==0)
  53. fprintf(fp,"%d ", i);
  54. }
  55. return;
  56. }
  57.  
  58. int calcolaScambi(int *freccie, int delimS, int delimD){
  59.  
  60. int k, i, scambi=0;
  61.  
  62. k = (delimD - delimS+1)/2;
  63.  
  64. for(i=delimS;i<k+delimS;i++){
  65. if(freccie[i]==1)
  66. scambi++;
  67. }
  68. for(i=k+delimS;i<=delimD;i++){
  69. if(freccie[i]==0)
  70. scambi++;
  71. }
  72. return scambi;
  73. }
  74.  
  75. void display(int** freccie, int **s, int delimS, int delimD, FILE *fp){
  76.  
  77. if(s[delimS][delimD] == 0){
  78. stampaFreccie(freccie, delimS, delimD, fp);
  79. return;
  80. }
  81. else{
  82. display(freccie, s, delimS, s[delimS][delimD], fp);
  83. display(freccie, s, s[delimS][delimD]+1, delimD, fp);
  84. return;
  85. }
  86. }
  87.  
  88. void allocaMatrici(int ***p_matr, int ***p_s, int N){
  89.  
  90. int **tmp1,**tmp2;
  91. int i;
  92.  
  93. tmp1 = malloc(N * sizeof(int*));
  94. tmp2 = malloc(N * sizeof(int*));
  95. for(i=0;i<N;i++){
  96. tmp1[i] = malloc(N * sizeof(int));
  97. tmp2[i] = malloc(N * sizeof(int));
  98. }
  99.  
  100. *p_matr=tmp1;
  101. *p_s=tmp2;
  102. }
  103.  
  104. int BottomUp(int N, int *freccie, FILE *fp){
  105.  
  106.  
  107. int **matr, **s, l, j, i, q, c, min, k;
  108.  
  109. allocaMatrici(&matr, &s , N);
  110.  
  111. for (l = 1; l < N; l=l+2)
  112. for (i = 0, j=l; j < N; i=i+2, j=j+2) {
  113. fprintf(fp,"calcolo scambi sul vettore da (%d,%d) (compresi)\n", i, j);
  114. q = calcolaScambi(freccie, i, j);
  115. fprintf(fp,"considerando tutto il vettore sono necessari %d scambi\n", q);
  116.  
  117. min=INT_MAX;
  118.  
  119. if( j-i != 1)
  120. for(k=i+1;k<j;k=k+2){
  121. c = matr[i][k] + matr[k+1][j];
  122. fprintf(fp,"(solo memorizzati) spezzando il vettore in (%d,%d) e (%d,%d) sono necessari %d scambi \n", 0,k,k+1,j, c);
  123. if(c<min){
  124. min=c;
  125. s[i][j]=k;
  126. }
  127. }
  128.  
  129. if(min<q)
  130. matr[i][j] = min;
  131. else{
  132. matr[i][j]=q;
  133. s[i][j]= 0;
  134. }
  135. fprintf(fp, "\n\n\n");
  136. }
  137.  
  138. fprintf(fp,"Le posizioni delle freccie da invertire sono: ");
  139. display(freccie, s, 0, N-1, fp);
  140.  
  141. return(matr[0][N-1]);
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement