1105. Spiral Matrix (25)解题报告

来源:互联网 发布:微信网站怎么制作 知乎 编辑:程序博客网 时间:2024/05/15 23:48

运用递归、分治思想解决此问题。


#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <cstdlib>int cmp(const void *v1, const void *v2);void fill(int **matrix, int offset, int m, int n, int arr[]);int main(void){int N, *arr, m, n, min, i, j, **matrix;scanf("%d", &N);for (i = N; i > 0; i--) {if (!(N % i)) {min = i - N / i;if (min >= 0) {m = i;n = N / i;}else {break;}}}arr = new int[N];for (i = 0; i < N; i++) {scanf("%d", arr + i);}qsort(arr, N, sizeof(int), cmp);matrix = new int*[m];for (i = 0; i < m; i++) {matrix[i] = new int[n];}fill(matrix, 0, m, n, arr);for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {if (j) {printf(" %d", matrix[i][j]);}else {printf("%d", matrix[i][j]);}}putchar('\n');}return 0;}int cmp(const void *v1, const void *v2) {return *((int *)v2) - *((int *)v1);}void fill(int **matrix, int offset, int m, int n, int arr[]) {static int cnt = 0;if ((offset + 1 ) * 2 <= n) {int i;for (i = offset; i < n - offset - 1; i++) {matrix[offset][i] = arr[cnt++];}for (i = offset; i < m - offset - 1; i++) {matrix[i][n - 1 - offset] = arr[cnt++];}for (i = n - offset - 1; i > offset; i--) {matrix[m - offset - 1][i] = arr[cnt++];}for (i = m - offset - 1; i > offset; i--) {matrix[i][offset] = arr[cnt++];}fill(matrix, offset + 1, m, n, arr);}else if ((offset + 1) * 2 == n + 1) {int i;for (i = offset; i < m - offset; i++) {matrix[i][offset] = arr[cnt++];}}return;}

0 0