Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Problem ID :
- //Render square matrix
- //Date:2016.OCT.7
- //Creator : Wen-Kai Wang
- //Email:[email protected]
- #include <stdio.h>
- #include <stdbool.h>
- #include <math.h>
- void DrawMatrix(int **maze, int *colSize, int size)
- {
- for (int i = 0; i < size; ++i)
- {
- for (int j = 0; j < size; ++j)
- if (j != size - 1)
- printf("%-*d ", colSize[j], maze[j][i]);
- else
- printf("%-*d", colSize[j], maze[j][i]);
- printf("\n");
- }
- //printf("\n");
- }
- enum { right = 1, down, left, up };
- //Recurrence
- bool WriteNumber(int **maze, int x, int y, int size, int counter, int dir)
- {
- if (x >= size || y >= size || x < 0 || y < 0) return false;
- if (maze[x][y] > 0) return false;
- maze[x][y] = counter++;
- switch (dir)
- {
- case right:
- if (WriteNumber(maze, x + 1, y, size, counter, right) == true) return true; break;
- case down:
- if (WriteNumber(maze, x, y + 1, size, counter, down) == true) return true; break;
- case left:
- if (WriteNumber(maze, x - 1, y, size, counter, left) == true) return true; break;
- case up:
- if (WriteNumber(maze, x, y - 1, size, counter, up) == true) return true; break;
- }
- if (WriteNumber(maze, x + 1, y, size, counter, right) == true) return true;
- if (WriteNumber(maze, x, y + 1, size, counter, down) == true) return true;
- if (WriteNumber(maze, x - 1, y, size, counter, left) == true) return true;
- if (WriteNumber(maze, x, y - 1, size, counter, up) == true) return true;
- return true;
- }
- void CountSize(int **maze, int *colSize, int size)
- {
- int k = -1;
- for (int i = 0; i < size; ++i)
- {
- for (int j = 0; j < size; ++j)
- if ((int)(log10(maze[i][j]) + 1) > k) k = (int)(log10(maze[i][j]) + 1);
- colSize[i] = k;
- k = -1;
- }
- }
- //For Loop
- void WriteNumberFor(int **maze, int size)
- {
- int counter = 1, dir = right;
- int x = 0, y = 0;
- while (counter <= size * size)
- {
- switch (dir)
- {
- case right:
- if (x >= size)
- {
- x -= 1;
- ++y;
- dir = down;
- }
- else
- {
- if (maze[x][y] != 0)
- {
- x -= 1;
- ++y;
- dir = down;
- }
- else
- {
- maze[x++][y] = counter++;
- dir = right;
- }
- }
- break;
- case down:
- if (y >= size)
- {
- y -= 1;
- --x;
- dir = left;
- }
- else
- {
- if (maze[x][y] != 0)
- {
- y -= 1;
- --x;
- dir = left;
- }
- else
- {
- maze[x][y++] = counter++;
- dir = down;
- }
- }
- break;
- case left:
- if (x < 0)
- {
- x += 1;
- --y;
- dir = up;
- }
- else
- {
- if (maze[x][y] != 0)
- {
- x += 1;
- --y;
- dir = up;
- }
- else
- {
- maze[x--][y] = counter++;
- dir = left;
- }
- }
- break;
- case up:
- if (y < 0)
- {
- y += 1;
- ++x;
- dir = right;
- }
- else
- {
- if (maze[x][y] != 0)
- {
- y += 1;
- ++x;
- dir = right;
- }
- else
- {
- maze[x][y--] = counter++;
- dir = up;
- }
- }
- break;
- }
- }
- }
- int main(void)
- {
- int **maze, *colSize, size;
- while (~scanf("%d", &size))
- {
- maze = (int **)malloc(size * sizeof(int*));
- for (int i = 0; i < size; ++i)
- maze[i] = (int *)malloc(size * sizeof(int));
- for (int i = 0; i < size; ++i)
- for (int j = 0; j < size; ++j)
- maze[i][j] = 0;
- colSize = (int *)malloc(size * sizeof(int));
- for (int i = 0; i < size; ++i)
- colSize[i] = 0;
- //int counter = 1;
- //WriteNumber(maze, 0, 0, size, counter, 1);
- WriteNumberFor(maze, size);
- CountSize(maze, colSize, size);
- DrawMatrix(maze, colSize, size);
- for (int i = 0; i < size; ++i)
- free(maze[i]);
- free(maze);
- free(colSize);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment