juinda

Untitled

Oct 11th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.60 KB | None | 0 0
  1. //Problem ID :
  2. //Render square matrix
  3. //Date:2016.OCT.7
  4. //Creator : Wen-Kai Wang
  5.  
  6. #include <stdio.h>
  7. #include <stdbool.h>
  8. #include <math.h>
  9.  
  10. void DrawMatrix(int **maze, int *colSize, int size)
  11. {
  12. for (int i = 0; i < size; ++i)
  13. {
  14. for (int j = 0; j < size; ++j)
  15. if (j != size - 1)
  16. printf("%-*d ", colSize[j], maze[j][i]);
  17. else
  18. printf("%-*d", colSize[j], maze[j][i]);
  19. printf("\n");
  20. }
  21. //printf("\n");
  22. }
  23.  
  24. enum { right = 1, down, left, up };
  25. //Recurrence
  26. bool WriteNumber(int **maze, int x, int y, int size, int counter, int dir)
  27. {
  28. if (x >= size || y >= size || x < 0 || y < 0) return false;
  29. if (maze[x][y] > 0) return false;
  30. maze[x][y] = counter++;
  31. switch (dir)
  32. {
  33. case right:
  34. if (WriteNumber(maze, x + 1, y, size, counter, right) == true) return true; break;
  35. case down:
  36. if (WriteNumber(maze, x, y + 1, size, counter, down) == true) return true; break;
  37. case left:
  38. if (WriteNumber(maze, x - 1, y, size, counter, left) == true) return true; break;
  39. case up:
  40. if (WriteNumber(maze, x, y - 1, size, counter, up) == true) return true; break;
  41. }
  42.  
  43. if (WriteNumber(maze, x + 1, y, size, counter, right) == true) return true;
  44. if (WriteNumber(maze, x, y + 1, size, counter, down) == true) return true;
  45. if (WriteNumber(maze, x - 1, y, size, counter, left) == true) return true;
  46. if (WriteNumber(maze, x, y - 1, size, counter, up) == true) return true;
  47.  
  48. return true;
  49. }
  50.  
  51. void CountSize(int **maze, int *colSize, int size)
  52. {
  53. int k = -1;
  54. for (int i = 0; i < size; ++i)
  55. {
  56. for (int j = 0; j < size; ++j)
  57. if ((int)(log10(maze[i][j]) + 1) > k) k = (int)(log10(maze[i][j]) + 1);
  58. colSize[i] = k;
  59. k = -1;
  60. }
  61. }
  62. //For Loop
  63. void WriteNumberFor(int **maze, int size)
  64. {
  65. int counter = 1, dir = right;
  66. int x = 0, y = 0;
  67. while (counter <= size * size)
  68. {
  69. switch (dir)
  70. {
  71. case right:
  72. if (x >= size)
  73. {
  74. x -= 1;
  75. ++y;
  76. dir = down;
  77. }
  78. else
  79. {
  80. if (maze[x][y] != 0)
  81. {
  82. x -= 1;
  83. ++y;
  84. dir = down;
  85. }
  86. else
  87. {
  88. maze[x++][y] = counter++;
  89. dir = right;
  90. }
  91. }
  92. break;
  93. case down:
  94. if (y >= size)
  95. {
  96. y -= 1;
  97. --x;
  98. dir = left;
  99. }
  100. else
  101. {
  102. if (maze[x][y] != 0)
  103. {
  104. y -= 1;
  105. --x;
  106. dir = left;
  107. }
  108. else
  109. {
  110. maze[x][y++] = counter++;
  111. dir = down;
  112. }
  113. }
  114. break;
  115. case left:
  116. if (x < 0)
  117. {
  118. x += 1;
  119. --y;
  120. dir = up;
  121. }
  122. else
  123. {
  124. if (maze[x][y] != 0)
  125. {
  126. x += 1;
  127. --y;
  128. dir = up;
  129. }
  130. else
  131. {
  132. maze[x--][y] = counter++;
  133. dir = left;
  134. }
  135. }
  136. break;
  137. case up:
  138. if (y < 0)
  139. {
  140. y += 1;
  141. ++x;
  142. dir = right;
  143. }
  144. else
  145. {
  146. if (maze[x][y] != 0)
  147. {
  148. y += 1;
  149. ++x;
  150. dir = right;
  151. }
  152. else
  153. {
  154. maze[x][y--] = counter++;
  155. dir = up;
  156. }
  157. }
  158. break;
  159. }
  160. }
  161.  
  162. }
  163.  
  164. int main(void)
  165. {
  166. int **maze, *colSize, size;
  167. while (~scanf("%d", &size))
  168. {
  169. maze = (int **)malloc(size * sizeof(int*));
  170. for (int i = 0; i < size; ++i)
  171. maze[i] = (int *)malloc(size * sizeof(int));
  172. for (int i = 0; i < size; ++i)
  173. for (int j = 0; j < size; ++j)
  174. maze[i][j] = 0;
  175. colSize = (int *)malloc(size * sizeof(int));
  176. for (int i = 0; i < size; ++i)
  177. colSize[i] = 0;
  178.  
  179. //int counter = 1;
  180. //WriteNumber(maze, 0, 0, size, counter, 1);
  181. WriteNumberFor(maze, size);
  182. CountSize(maze, colSize, size);
  183. DrawMatrix(maze, colSize, size);
  184.  
  185. for (int i = 0; i < size; ++i)
  186. free(maze[i]);
  187. free(maze);
  188. free(colSize);
  189. }
  190.  
  191. return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment