| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /**
- * Return an array of arrays of size *returnSize.
- * The sizes of the arrays are returned as *returnColumnSizes array.
- * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
- */
- int**
- shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize,
- int** returnColumnSizes)
- {
- int **ret = calloc(gridSize + 1, sizeof(int*));
- long total_size = 0;
- *returnSize = gridSize;
- *returnColumnSizes = calloc(gridSize + 1, sizeof(int));
- for ( int i = 0; i < gridSize; ++i ) {
- int col_size = gridColSize[i];
- (*returnColumnSizes)[i] = col_size;
- ret[i] = calloc(col_size + 1, sizeof(**ret));
- total_size += col_size;
- }
- int *intermed = calloc(total_size + 1, sizeof(int));
- long intermed_size = 0;
- for ( int i = 0; i < gridSize; ++i ) {
- int col_size = gridColSize[i];
- for ( int j = 0; j < col_size; ++j ) {
- intermed[intermed_size++] = grid[i][j];
- }
- }
- for ( int i = 0; i < k; ++i ) {
- int last = intermed[intermed_size-1];
- for ( int j = intermed_size-1; j > 0; --j ) {
- intermed[j] = intermed[j-1];
- }
- intermed[0] = last;
- }
- intermed_size = 0;
- for ( int i = 0; i < gridSize; ++i ) {
- int col_size = gridColSize[i];
- for ( int j = 0; j < col_size; ++j ) {
- ret[i][j] = intermed[intermed_size++];
- }
- }
- free(intermed);
- return ret;
- }
- struct matrix {
- int **data;
- unsigned long first_size;
- unsigned long second_size;
- };
- char *
- matrix_to_cstr(const struct matrix *m)
- {
- static char data[1024] = {0};
- static unsigned long cap = 1024;
- unsigned long size = 0;
- memset(data, 0, cap);
- data[size++] = '[';
- for ( unsigned long i = 0; i < m->first_size; ++i ) {
- if ( i == 0 ) {
- data[size++] = '[';
- } else {
- data[size++] = ',';
- data[size++] = '[';
- }
- for ( unsigned long j = 0; j < m->second_size; ++j ) {
- if ( j == 0 ) {
- data[size++] = m->data[i][j] + 48;
- } else {
- data[size++] = ',';
- data[size++] = m->data[i][j] + 48;
- }
- }
- data[size++] = ']';
- }
- data[size++] = ']';
- data[size++] = '\0';
- char *ret = calloc(size+1, sizeof(char));
- memcpy(ret, data, size);
- return ret;
- }
- void
- r(const struct matrix *m, int k, const struct matrix *exp)
- {
- (void) exp;
- struct matrix ret = *m;
- int t1;
- int *t2 = NULL;
- int sizes[m->first_size];
- for ( unsigned long i = 0; i < m->first_size; ++i ) {
- sizes[i] = m->second_size;
- }
- ret.data = shiftGrid(m->data, m->first_size, sizes, k, &t1, &t2);
- char *m_cstr = matrix_to_cstr(m);
- char *ret_cstr = matrix_to_cstr(&ret);
- char *exp_cstr = matrix_to_cstr(exp);
- printf("shiftGrid(%s, %d) = %s | exp: %s\n", m_cstr, k, ret_cstr, exp_cstr);
- free(m_cstr);
- free(ret_cstr);
- free(exp_cstr);
- free(t2);
- for ( unsigned long i = 0; i < m->first_size; ++i ) {
- free(ret.data[i]);
- }
- free(ret.data);
- }
- int
- main(void)
- {
- int in11[] = {1,2,3};
- int in12[] = {4,5,6};
- int in13[] = {7,8,9};
- int *in1[] = {in11,in12,in13};
- struct matrix min1 = {in1, 3, 3};
- int exp11[] = {9,1,2};
- int exp12[] = {3,4,5};
- int exp13[] = {6,7,8};
- int *exp1[] = {exp11,exp12,exp13};
- struct matrix mexp1 = {exp1, 3, 3};
- r(&min1, 1, &mexp1);
- int in21[] = {1};
- int *in2[] = {in21};
- struct matrix min2 = {in2, 1, 1};
- int exp21[] = {1};
- int *exp2[] = {exp21};
- struct matrix mexp2 = {exp2, 1, 1};
- r(&min2, 100, &mexp2);
- return 0;
- }
|