将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序一次从小到大存放),写一函数实现之。用main函数调用。
#include <stdio.h>
#define NL "\n"
#define PR_NL printf("\n");
#define ARRAY_NUM 5
void sort(int a[4][3]) //对4个最小值按照小--》大排序
{
int i, j, t, temp;
for (i = 0; i < 3; i++)
{
t = i;
for (j = i + 1; j < 4; j++)
{
if (a[j][0] < a[t][0])
t = j;
}
if (t != i)
{
for (j = 0; j < 3; j++)
{
temp = a[i][j];
a[i][j] = a[t][j];
a[t][j] = temp;
}
}
}
}
void getmin(int a[4][3], int value, int min_i, int min_j)
{
int i, j, k, t;
for (i = 0; i < 4; i++)
{
if (a[i][0] > value)
break;
}
if (i != 4) //查找到比保存的4个最小值还要小的值,保存值及行列位置
{
for (j = 3; j > i; j--)
{
for (k = 0; k < 3; k++)
{
t = a[j][k];
a[j][k] = a[j-1][k];
a[j-1][k] = t;
}
}
a[i][0] = value;
a[i][1] = min_i;
a[i][2] = min_j;
}
}
void reload(int (*p)[ARRAY_NUM], int n)
{
int i, j, temp, min[4][3] = {0};
int max_i, max_j, (*pt)[ARRAY_NUM];
max_i = 0;
max_j = 0;
pt = p;
for (i = 0; i < 4; i++) //最大值,4个最小值的初始值以及行列位置
{
min[i][0] = *(*pt + i);
min[i][1] = 0;
min[i][2] = i;
if (*(*(p + max_i) + max_j) < *(*pt + i))
max_j = i;
}
sort(min);
for (i = 0; i < n; i++)
{
for (i == 0 ? (j = 4) : (j = 0); j < n; j++)
{
if (*(*(p + i) + j) > *(*(p + max_i) + max_j)) //获取最大值
{
max_i = i;
max_j = j;
}
getmin(min, *(*(p + i) + j), i, j); //与保存的4个最小值比较
}
}
temp = *(*(pt + 2) + 2); //最大值
*(*(pt + 2) + 2) = *(*(pt + max_i) + max_j);
*(*(pt + max_i) + max_j) = temp;
temp = **pt; //4个最小值
**pt = min[0][0];
*(*(pt + min[0][1]) + min[0][2]) = temp;
temp = *(*(pt + 0) + ARRAY_NUM - 1);
*(*(pt + 0) + ARRAY_NUM - 1) = min[1][0];
*(*(pt + min[1][1]) + min[1][2]) = temp;
temp = *(*(pt + ARRAY_NUM - 1) + 0);
*(*(pt + ARRAY_NUM - 1) + 0) = min[2][0];
*(*(pt + min[2][1]) + min[2][2]) = temp;
temp = *(*(pt + ARRAY_NUM - 1) + ARRAY_NUM - 1);
*(*(pt + ARRAY_NUM - 1) + ARRAY_NUM - 1) = min[3][0];
*(*(pt + min[3][1]) + min[3][2]) = temp;
}
void main()
{
int i, j, a[ARRAY_NUM][ARRAY_NUM];
printf("intput %d number"NL, ARRAY_NUM);
for (i = 0; i < ARRAY_NUM; i++) //输入数组
for (j = 0; j < ARRAY_NUM; j++)
scanf("%d", &a[i][j]);
PR_NL;
for (i = 0; i < ARRAY_NUM; i++) //移动之前
{
for (j = 0; j < ARRAY_NUM; j++)
printf("%4d", a[i][j]);
PR_NL;
}
reload(a, ARRAY_NUM); //按照要求移动数据
PR_NL;
printf("after reload: \n"); //移动之后
for (i = 0; i < ARRAY_NUM; i++)
{
for (j = 0; j < ARRAY_NUM; j++)
printf("%4d", a[i][j]);
PR_NL;
}
}