Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- void modify(int *nr_elem, int **mat, int index, int row, int val, char type ) {
- char **char_mat;
- short int **short_mat;
- char_mat = (char **) mat;
- short_mat = (short int **) mat;
- index--;
- int size = index;
- if(type == 'S')
- size /= 2;
- else if(type == 'C')
- size /= 4;
- if(size >= nr_elem[row]) {
- int *new_line = malloc((size + 1) * sizeof(int));
- memset(new_line, 0, (size + 1) * sizeof(int));
- memcpy(new_line, mat[row], size * sizeof(int));
- free(mat[row]);
- mat[row] = new_line;
- nr_elem[row] = size + 1;
- }
- if(type == 'I')
- mat[row][index] = val;
- else if(type == 'S')
- short_mat[row][index] = val;
- else char_mat[row][index] = val;
- }
- void swap(int **mat, int index, int row, char type) {
- char **char_mat;
- int pp = 0;
- char_mat = (char **) mat;
- int size = index;
- if(type == 'S') {
- if(size % 2 != 0) {
- pp = 1;
- }
- size /= 2;
- }
- int size_b = 4 * size;
- if(type == 'I') {
- int aux = mat[row][size];
- char *ch_aux = (char *) &aux;
- char_mat[row][size_b] = ch_aux[3];
- char_mat[row][size_b + 1] = ch_aux[2];
- char_mat[row][size_b + 2] = ch_aux[1];
- char_mat[row][size_b + 3] = ch_aux[0];
- } else {
- if(type == 'S') {
- //printf("%08X\n", mat[row][size]);
- //printf("%08X\n", ((short *) &mat[row][size])[1]);
- //printf("%08X\n", ((short *) &mat[row][size])[0]);
- //printf("%d\n", pp);
- pp=0;
- int aux = mat[row][size];
- char * ch_aux = (char *) &aux;
- char_mat[row][size_b] = ch_aux[2 * pp + 1];
- char_mat[row][size_b + 1] = ch_aux[2 * pp];
- }
- }
- }
- int suma(int i, int j, int x, int n, int e) {
- char byte0, byte1, byte2, byte3;
- int s = 0;
- byte0 = (char) ((x >> (0*8)) & 0x000000FF);
- byte1 = (char) ((x >> (1*8)) & 0x000000FF);
- byte2 = (char) ((x >> (2*8)) & 0x000000FF);
- byte3 = (char) ((x >> (3*8)) & 0x000000FF);
- if(i == 0 || i == n - 1) {
- s = s + byte3 + byte2 + byte1 + byte0;
- } else {
- if(j == 0) {
- s = s + byte0;
- }
- if(j == e - 1) {
- s = s + byte3;
- }
- }
- return s;
- }
- void fill(int i, int j, char **char_mat,int nr_rows,int *nr_elem,int *cnt) {
- char_mat[i][j] = 1;
- (*cnt)++;
- const int dir_x[] = { -1, +1, 0, 0};
- const int dir_y[] = { 0, 0, +1, -1};
- for(int dir = 0; dir < 4; dir++) {
- int i2, j2;
- i2 = i + dir_x[dir];
- j2 = j + dir_y[dir];
- if(i2 < nr_rows && j2 < 4 * nr_elem[i2] && i2 >= 0 && j2 >= 0 && char_mat[i2][j2] == 0) {
- fill(i2, j2, char_mat, nr_rows, nr_elem, cnt);
- }
- }
- }
- int main() {
- //freopen("a.in","r",stdin);
- //freopen("a.out","w",stdout);
- int nr_rows, *nr_elem, **mat, s = 0, nr_bytes = 0;
- scanf("%d", &nr_rows);
- nr_elem = (int *) malloc(nr_rows * sizeof(int));
- mat = (int **) malloc(nr_rows * sizeof(int *));
- for(int i = 0; i < nr_rows; i++) {
- scanf("%d", &nr_elem[i]);
- mat[i] = malloc(nr_elem[i] * sizeof(int));
- for(int j = 0; j < nr_elem[i]; j++) {
- scanf("%x", &mat[i][j]);
- s += suma(i, j, mat[i][j], nr_rows, nr_elem[i]);
- if(i == 0 || i == nr_rows - 1) {
- nr_bytes += 4;
- } else {
- if(j == 0) {
- if(j == nr_elem[i] - 1) {
- nr_bytes += 2;
- } else {
- nr_bytes += 1;
- }
- }
- if(j == nr_elem[i] - 1 && j != 0) {
- nr_bytes += 1;
- }
- }
- }
- }
- double medie = (double) s / nr_bytes;
- printf("task 1\n%.7f\ntask 2\n", medie);
- int k, linie, val, index;
- char mod, dim;
- scanf("%d", &k);
- for(int i = 0; i < k; i++) {
- scanf("%c", &mod);
- if(mod == '\n' || mod == ' ') {
- while(mod == '\n' || mod == ' ') {
- scanf("%c", &mod);
- }
- }
- scanf("%c", &dim);
- if(dim == '\n' || dim == ' ') {
- while(dim == '\n' || dim == ' ') {
- scanf("%c", &dim);
- }
- }
- scanf("%d%d", &linie, &index);
- if(mod == 'M') {
- scanf("%x", &val);
- modify(nr_elem, mat, index, linie, val, dim);
- }
- if(mod == 'D') {
- val = 0;
- modify(nr_elem, mat, index, linie, val, dim);
- }
- if(mod == 'S') {
- swap(mat, index, linie, dim);
- }
- }
- for(int i = 0; i < nr_rows; i++) {
- for(int j = 0; j < nr_elem[i]; j++) {
- printf("%08X ", mat[i][j]);
- }
- printf("\n");
- }
- printf("task 3\n");
- char ** char_mat = (char **) mat;
- // for(int i = 0; i< nr_rows; i++) {
- // for(int j = 0; j < 4 * nr_elem[i]; j++) {
- // printf
- // }
- // }
- int max = 0, i_min = 0, j_min = 0;
- for(int i = 0; i < nr_rows; i++) {
- for(int j = 0; j < 4 * nr_elem[i]; j++) {
- if(char_mat[i][j] == 0) {
- int cnt = 0;
- fill(i, j, char_mat, nr_rows, nr_elem, &cnt);
- if(cnt > max) {
- max = cnt;
- i_min = i;
- j_min = j;
- }
- }
- }
- }
- printf("%d %d %d\n", i_min, j_min, max);
- for(int i = 0; i < nr_rows; i++) {
- free(mat[i]);
- }
- free(mat);
- // MODIFICARE AICI
- free(nr_elem);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement