Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5.  
  6. void modify(int *nr_elem, int **mat, int index, int row, int val, char type ) {
  7.     char **char_mat;
  8.     short int **short_mat;
  9.     char_mat = (char **) mat;
  10.     short_mat = (short int **) mat;
  11.     index--;
  12.     int size = index;
  13.  
  14.     if(type == 'S')
  15.         size /= 2;
  16.     else if(type == 'C')
  17.         size /= 4;
  18.  
  19.     if(size >= nr_elem[row]) {
  20.         int *new_line = malloc((size + 1) * sizeof(int));
  21.         memset(new_line, 0, (size + 1) * sizeof(int));
  22.         memcpy(new_line, mat[row], size * sizeof(int));
  23.         free(mat[row]);
  24.         mat[row] = new_line;
  25.         nr_elem[row] = size + 1;
  26.     }
  27.  
  28.     if(type == 'I')
  29.         mat[row][index] = val;
  30.     else if(type == 'S')
  31.         short_mat[row][index] = val;
  32.     else char_mat[row][index] = val;
  33. }
  34.  
  35. void swap(int **mat, int index, int row, char type) {
  36.     char **char_mat;
  37.     int pp = 0;
  38.     char_mat = (char **) mat;
  39.     int size = index;
  40.     if(type == 'S') {
  41.         if(size % 2 != 0) {
  42.             pp = 1;
  43.         }
  44.         size /= 2;
  45.     }
  46.     int size_b = 4 * size;
  47.     if(type == 'I') {
  48.         int aux = mat[row][size];
  49.         char *ch_aux = (char *) &aux;
  50.         char_mat[row][size_b] = ch_aux[3];
  51.         char_mat[row][size_b + 1] = ch_aux[2];
  52.         char_mat[row][size_b + 2] = ch_aux[1];
  53.         char_mat[row][size_b + 3] = ch_aux[0];
  54.     } else {
  55.         if(type == 'S') {
  56.             //printf("%08X\n", mat[row][size]);
  57.  
  58.             //printf("%08X\n", ((short *) &mat[row][size])[1]);
  59.             //printf("%08X\n", ((short *) &mat[row][size])[0]);
  60.             //printf("%d\n", pp);
  61.             pp=0;
  62.             int aux = mat[row][size];
  63.             char * ch_aux = (char *) &aux;
  64.             char_mat[row][size_b] = ch_aux[2 * pp + 1];
  65.             char_mat[row][size_b + 1] = ch_aux[2 * pp];
  66.         }
  67.     }
  68. }
  69.  
  70. int suma(int i, int j, int x, int n, int e) {
  71.     char byte0, byte1, byte2, byte3;
  72.     int s = 0;
  73.     byte0 = (char) ((x >> (0*8)) & 0x000000FF);
  74.     byte1 = (char) ((x >> (1*8)) & 0x000000FF);
  75.     byte2 = (char) ((x >> (2*8)) & 0x000000FF);
  76.     byte3 = (char) ((x >> (3*8)) & 0x000000FF);
  77.     if(i == 0 || i == n - 1) {
  78.         s = s + byte3 + byte2 + byte1 + byte0;
  79.     } else {
  80.         if(j == 0) {
  81.             s = s + byte0;
  82.         }
  83.         if(j == e - 1) {
  84.             s = s + byte3;
  85.         }
  86.     }
  87.     return s;
  88. }
  89.  
  90. void fill(int i, int j, char **char_mat,int nr_rows,int *nr_elem,int *cnt) {
  91.     char_mat[i][j] = 1;
  92.     (*cnt)++;
  93.     const int dir_x[] = { -1, +1, 0, 0};
  94.     const int dir_y[] = { 0, 0, +1, -1};
  95.     for(int dir = 0; dir < 4; dir++) {
  96.         int i2, j2;
  97.         i2 = i + dir_x[dir];
  98.         j2 = j + dir_y[dir];
  99.         if(i2 < nr_rows && j2 < 4 * nr_elem[i2] && i2 >= 0 && j2 >= 0 && char_mat[i2][j2] == 0) {
  100.             fill(i2, j2, char_mat, nr_rows, nr_elem, cnt);
  101.         }
  102.     }
  103. }
  104.  
  105. int main() {
  106.     //freopen("a.in","r",stdin);
  107.     //freopen("a.out","w",stdout);
  108.  
  109.     int nr_rows, *nr_elem, **mat, s = 0, nr_bytes = 0;
  110.     scanf("%d", &nr_rows);
  111.     nr_elem = (int *) malloc(nr_rows * sizeof(int));
  112.     mat = (int **) malloc(nr_rows * sizeof(int *));
  113.     for(int i = 0; i < nr_rows; i++) {
  114.         scanf("%d", &nr_elem[i]);
  115.         mat[i] = malloc(nr_elem[i] * sizeof(int));
  116.         for(int j = 0; j < nr_elem[i]; j++) {
  117.             scanf("%x", &mat[i][j]);
  118.             s += suma(i, j, mat[i][j], nr_rows, nr_elem[i]);
  119.             if(i == 0 || i == nr_rows - 1) {
  120.                 nr_bytes += 4;
  121.             } else {
  122.                 if(j == 0) {
  123.                     if(j == nr_elem[i] - 1) {
  124.                         nr_bytes += 2;
  125.                     } else {
  126.                         nr_bytes += 1;
  127.                     }
  128.                 }
  129.                 if(j == nr_elem[i] - 1 && j != 0) {
  130.                     nr_bytes += 1;
  131.                 }
  132.             }
  133.         }
  134.     }
  135.     double medie = (double) s / nr_bytes;
  136.     printf("task 1\n%.7f\ntask 2\n", medie);
  137.     int k, linie, val, index;
  138.     char mod, dim;
  139.     scanf("%d", &k);
  140.     for(int i = 0; i < k; i++) {
  141.         scanf("%c", &mod);
  142.         if(mod == '\n' || mod == ' ') {
  143.             while(mod == '\n' || mod == ' ') {
  144.                 scanf("%c", &mod);
  145.             }
  146.         }
  147.         scanf("%c", &dim);
  148.         if(dim == '\n' || dim == ' ') {
  149.             while(dim == '\n' || dim == ' ') {
  150.                 scanf("%c", &dim);
  151.             }
  152.         }
  153.         scanf("%d%d", &linie, &index);
  154.         if(mod == 'M') {
  155.             scanf("%x", &val);
  156.             modify(nr_elem, mat, index, linie, val, dim);
  157.         }
  158.         if(mod == 'D') {
  159.             val = 0;
  160.             modify(nr_elem, mat, index, linie, val, dim);
  161.         }
  162.         if(mod == 'S') {
  163.             swap(mat, index, linie, dim);
  164.         }
  165.     }
  166.     for(int i = 0; i < nr_rows; i++) {
  167.         for(int j = 0; j < nr_elem[i]; j++) {
  168.             printf("%08X ", mat[i][j]);
  169.         }
  170.         printf("\n");
  171.     }
  172.     printf("task 3\n");
  173.     char ** char_mat = (char **) mat;
  174.     // for(int i = 0; i< nr_rows; i++) {
  175.     //     for(int j = 0; j < 4 * nr_elem[i]; j++) {
  176.     //         printf
  177.     //     }
  178.     // }
  179.     int max = 0, i_min = 0, j_min = 0;
  180.     for(int i = 0; i < nr_rows; i++) {
  181.         for(int j = 0; j < 4 * nr_elem[i]; j++) {
  182.             if(char_mat[i][j] == 0) {
  183.                 int cnt = 0;
  184.                 fill(i, j, char_mat, nr_rows, nr_elem, &cnt);
  185.                 if(cnt > max) {
  186.                     max = cnt;
  187.                     i_min = i;
  188.                     j_min = j;
  189.                 }
  190.             }
  191.         }
  192.     }
  193.     printf("%d %d %d\n", i_min, j_min, max);
  194.     for(int i = 0; i < nr_rows; i++) {
  195.         free(mat[i]);
  196.     }
  197.     free(mat);
  198.     // MODIFICARE AICI
  199.     free(nr_elem);
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement