PAT乙级1050. 螺旋矩阵(C语言)

PAT乙级真题题解目录


/*
 * 1. 先对输入的数组排序;
 * 2. 螺旋矩阵的行列数确定的关键:m−n 取所有可能值中的最小值;
 *  通过sqrt函数,开方再遍历,能最快地得到n;
 * 3. 螺旋矩阵的填充顺序:上 → 右 → 下 → 左;
 *  3.1 用二维数组存储螺旋矩阵(个人喜好,一位数组也可行);
 *  3.2 遍历填充二维数组,以二维数组的圈数作为遍历的次数,圈数为 n / 2 + n % 2(n <= m,每少一圈,列数-2);
 *  3.3 注意填充之后,对未填充的最上行、最右列、最下行、最左列进行更新;
 *  3.4 每遍历一次行/列后,判断是否已经遍历完所有数,跳出循环(避免后续的错误覆盖,时间的浪费);
 */
#include 
#include 
#include 

int cmp(const void *a, const void *b) {
    return *(int *)b - *(int *)a; //降序
}
int main(){
    int N, n, m;
    scanf("%d", &N);
    int arr[N];
    for (int i = 0; i < N; i++){
        scanf("%d", &arr[i]);
    }
    qsort(arr, N, sizeof(int), cmp);
    for (int i = sqrt((double)N); i >= 1; i--) {
        if (N % i == 0) {
            n = i;
            break;
        }
    }
    m = N / n;
    int matrix[m][n]; 
    int urow = 0, drow = m - 1, lcol = 0, rcol = n - 1, i = 0;
    for (int k = n / 2 + n % 2; k >= 0; k--) { //从外到里遍历的圈数 
        for (int j = lcol; j <= rcol && i != N; j++, i++) {//遍历最上行 
            matrix[urow][j] = arr[i];
        }
        urow++;//第一层遍历完毕 
        for (int j = urow; j <= drow && i != N; j++, i++) {//遍历最右列 
            matrix[j][rcol] = arr[i];
        }
        rcol--;//最后一列遍历完毕 
        for (int j = rcol; j >= lcol && i != N; j--, i++) {//倒序遍历最下行 
            matrix[drow][j] = arr[i]; 
        }
        drow--;//最后一行遍历完毕 
        for (int j = drow; j >= urow && i != N; j--, i++) {//倒序遍历最左的列 
            matrix[j][lcol] = arr[i];
        } 
        lcol++;//最左列遍历完毕 
    } 
    for (int i = 0; i < m; i++) { //输出矩阵
        for (int j = 0; j < n; j++) {
            if (j == n - 1) {
                printf("%d\n", matrix[i][j]);
            } else {
                printf("%d ", matrix[i][j]);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(PAT乙级真题)