将一个n×n(2<n<10,n为奇数)的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下顺序依次从小到大存放),写一函数实现。用main函数调用。

img

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void swap(int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int *find_max(int *p, int n)
{
    int *pMax = p;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int v = *(p + i * n + j);
            if (v > *pMax)
                pMax = p + i * n + j;
        }
    }
    return pMax;
}

int *find_min_k(int *p, int n, int k)
{
    int min[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
    int *pMin[4] = {};
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int v = *(p + i * n + j);
            for (int m = 0; m < 4; m++)
            {
                if (v < min[m])
                {
                    for (int s = 3; s > m; s--)
                    {
                        min[s] = min[s - 1];
                        pMin[s] = pMin[s - 1];
                    }
                    min[m] = v;
                    pMin[m] = p + i * n + j;
                    break;
                }
            }
        }
    }
    return pMin[k];
}

void change(int *p, int n)
{
    swap(find_max(p, n), p + n / 2 * n + n / 2);
    swap(find_min_k(p, n, 0), p);
    swap(find_min_k(p, n, 1), p + n - 1);
    swap(find_min_k(p, n, 2), p + (n - 1) * n);
    swap(find_min_k(p, n, 3), p + (n - 1) * n + n - 1);
}

int main()
{
    int **a, *p, i, j;
    int n;
    scanf("%d", &n);
    p = (int *)malloc(n * n * sizeof(int));
    a = (int **)malloc(n * sizeof(int *));
    for (int i = 0; i < n; i++)
        a[i] = p + n * i;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    change(p, n);
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
    free(p);
    free(a);
    return 0;
}