1260.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /**
  5. * Return an array of arrays of size *returnSize.
  6. * The sizes of the arrays are returned as *returnColumnSizes array.
  7. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
  8. */
  9. int**
  10. shiftGrid(int** grid, int gridSize, int* gridColSize, int k, int* returnSize,
  11. int** returnColumnSizes)
  12. {
  13. int **ret = calloc(gridSize + 1, sizeof(int*));
  14. long total_size = 0;
  15. *returnSize = gridSize;
  16. *returnColumnSizes = calloc(gridSize + 1, sizeof(int));
  17. for ( int i = 0; i < gridSize; ++i ) {
  18. int col_size = gridColSize[i];
  19. (*returnColumnSizes)[i] = col_size;
  20. ret[i] = calloc(col_size + 1, sizeof(**ret));
  21. total_size += col_size;
  22. }
  23. int *intermed = calloc(total_size + 1, sizeof(int));
  24. long intermed_size = 0;
  25. for ( int i = 0; i < gridSize; ++i ) {
  26. int col_size = gridColSize[i];
  27. for ( int j = 0; j < col_size; ++j ) {
  28. intermed[intermed_size++] = grid[i][j];
  29. }
  30. }
  31. for ( int i = 0; i < k; ++i ) {
  32. int last = intermed[intermed_size-1];
  33. int *interinter = calloc(intermed_size, sizeof(int));
  34. for ( int j = 0; j < intermed_size; ++j ) {
  35. interinter[j] = intermed[j];
  36. }
  37. for ( int j = 0; j < intermed_size-1; ++j ) {
  38. intermed[j+1] = interinter[j];
  39. }
  40. //memmove(intermed+1, intermed, intermed_size-2);
  41. free(interinter);
  42. intermed[0] = last;
  43. }
  44. intermed_size = 0;
  45. for ( int i = 0; i < gridSize; ++i ) {
  46. int col_size = gridColSize[i];
  47. for ( int j = 0; j < col_size; ++j ) {
  48. ret[i][j] = intermed[intermed_size++];
  49. }
  50. }
  51. free(intermed);
  52. return ret;
  53. }
  54. struct matrix {
  55. int **data;
  56. unsigned long first_size;
  57. unsigned long second_size;
  58. };
  59. char *
  60. matrix_to_cstr(const struct matrix *m)
  61. {
  62. static char data[1024] = {0};
  63. static unsigned long cap = 1024;
  64. unsigned long size = 0;
  65. memset(data, 0, cap);
  66. data[size++] = '[';
  67. for ( unsigned long i = 0; i < m->first_size; ++i ) {
  68. if ( i == 0 ) {
  69. data[size++] = '[';
  70. } else {
  71. data[size++] = ',';
  72. data[size++] = '[';
  73. }
  74. for ( unsigned long j = 0; j < m->second_size; ++j ) {
  75. if ( j == 0 ) {
  76. data[size++] = m->data[i][j] + 48;
  77. } else {
  78. data[size++] = ',';
  79. data[size++] = m->data[i][j] + 48;
  80. }
  81. }
  82. data[size++] = ']';
  83. }
  84. data[size++] = ']';
  85. data[size++] = '\0';
  86. char *ret = calloc(size+1, sizeof(char));
  87. memcpy(ret, data, size);
  88. return ret;
  89. }
  90. void
  91. r(const struct matrix *m, int k, const struct matrix *exp)
  92. {
  93. (void) exp;
  94. struct matrix ret = *m;
  95. int t1;
  96. int *t2 = NULL;
  97. int sizes[m->first_size];
  98. for ( unsigned long i = 0; i < m->first_size; ++i ) {
  99. sizes[i] = m->second_size;
  100. }
  101. ret.data = shiftGrid(m->data, m->first_size, sizes, k, &t1, &t2);
  102. char *m_cstr = matrix_to_cstr(m);
  103. char *ret_cstr = matrix_to_cstr(&ret);
  104. char *exp_cstr = matrix_to_cstr(exp);
  105. printf("shiftGrid(%s, %d) = %s | exp: %s", m_cstr, k, ret_cstr, exp_cstr);
  106. free(m_cstr);
  107. free(ret_cstr);
  108. free(exp_cstr);
  109. free(t2);
  110. for ( unsigned long i = 0; i < m->first_size; ++i ) {
  111. free(ret.data[i]);
  112. }
  113. free(ret.data);
  114. }
  115. int
  116. main(void)
  117. {
  118. int in11[] = {1,2,3};
  119. int in12[] = {4,5,6};
  120. int in13[] = {7,8,9};
  121. int *in1[] = {in11,in12,in13};
  122. struct matrix min1 = {in1, 3, 3};
  123. int exp11[] = {9,1,2};
  124. int exp12[] = {3,4,5};
  125. int exp13[] = {6,7,8};
  126. int *exp1[] = {exp11,exp12,exp13};
  127. struct matrix mexp1 = {exp1, 3, 3};
  128. r(&min1, 1, &mexp1);
  129. int in21[] = {1};
  130. int *in2[] = {in21};
  131. struct matrix min2 = {in2, 1, 1};
  132. int exp21[] = {1};
  133. int *exp2[] = {exp21};
  134. struct matrix mexp2 = {exp2, 1, 1};
  135. r(&min2, 100, &mexp2);
  136. return 0;
  137. }