` #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5//这里需要是奇数,偶数没有中心
//位置结构体,记录某点的值和坐标
struct weizhi { int i; //值 int line; //行 int row; //列 };
int change(int a[N][N]) { struct weizhi max1 = {0,0,0};//记录最大值
struct weizhi min1 = {100,0,0}, min2 = {100,0,0};//记录四个最小值:min1<min2<min3<min4
struct weizhi min3 = {100,0,0}, min4 = {100,0,0};
int line = 0;
int row = 0;
int index = 0;
int temp = 0;
//遍历最大最小数
for (line = 0; line != N; ++line)//
{
for (row = 0; row != N; ++row)
{
//遍历最大数
if (a[line][row] > max1.i)
{
max1.i = a[line][row];
max1.line = line;
max1.row = row;
}
//如果这个数比第四小的小,就要和第三小的进行比较
if (a[line][row] < min4.i)
{
//如果这个数比第三小的小,就要和第二小的进行比较
if (a[line][row] < min3.i)
{
//如果这个数比第二小的小,就要和第一小的进行比较
if (a[line][row] < min2.i)
{
//如果比第一小的小
if (a[line][row] < min1.i)
{
//最小的几个依次向后串一个
min4 = min3;
min3 = min2;
min2 = min1;
//记录最小值
min1.i = a[line][row];
min1.line = line;
min1.row = row;
}
else
{
//前面的数依次向后串
min4 = min3;
min3 = min2;
//记录第二小的值
min2.i = a[line][row];
min2.line = line;
min2.row = row;
}
}
else
{
min4 = min3;
//记录第三小的值
min3.i = a[line][row];
min3.line = line;
min3.row = row;
}
}
else
{
//记录第四小的值
min4.i = a[line][row];
min4.line = line;
min4.row = row;
}
}
}
}
//置换最大数,并判断其他特殊元素位置是否因交换而改变位置
temp = a[N/2][N/2];
a[N/2][N/2] = max1.i;
a[max1.line][max1.row] = temp;
if (N/2 == min1.line && N/2 == min1.row)
{
min1.line = max1.line;
min1.row = max1.row;
}
else if (N/2 == min2.line && N/2 == min2.row)
{
min2.line = max1.line;
min2.row = max1.row;
}
else if (N/2 == min3.line && N/2 == min3.row)
{
min3.line = max1.line;
min3.row = max1.row;
}
else if (N/2 == min4.line && N/2 == min4.row)
{
min4.line = max1.line;
min4.row = max1.row;
}
//置换最第一小的数,并判断其他特殊元素位置是否因交换而改变位置
temp = a[0][0];
a[0][0] = min1.i;
a[min1.line][min1.row] = temp;
if (0 == min2.line && 0 == min2.row)
{
min2.line = min1.line;
min2.row = min1.row;
}
else if (0 == min3.line && 0 == min3.row)
{
min3.line = min1.line;
min3.row = min1.row;
}
else if (0 == min4.line && 0 == min4.row)
{
min4.line = min1.line;
min4.row = min1.row;
}
//置换最第二小的数,并判断其他特殊元素位置是否因交换而改变位置
temp = a[0][N-1];
a[0][N-1] = min2.i;
a[min2.line][min2.row] = temp;
if (0 == min3.line && N-1 == min3.row)
{
min3.line = min2.line;
min3.row = min2.row;
}
else if (0 == min4.line && N-1 == min4.row)
{
min4.line = min2.line;
min4.row = min2.row;
}
//置换最第三小的数,并判断其他特殊元素位置是否因交换而改变位置
temp = a[N-1][0];
a[N-1][0] = min3.i;
a[min3.line][min3.row] = temp;
if (N-1 == min4.line && 0 == min4.row)
{
min4.line = min3.line;
min4.row = min3.row;
}
//置换最第四小的数
temp = a[N-1][N-1];
a[N-1][N-1] = min4.i;
a[min4.line][min4.row] = temp;
return 0;
}
int main()
{
int a[N][N] = {0};
int x = 0, y = 0;
int index=0;
int *p=*a;
//随机生成数组
srand((unsigned )time(NULL));
for (x = 0; x != N; ++x)
{
for (y = 0; y != N; ++y)
{
a[x][y]=rand()%100;
}
}
//输出原数组
for (x = 0; x != N; ++x)
{
for (y = 0; y != N; ++y)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
printf("\n\n");
//置换
change(a);
//输出置换后的数组
for (x = 0; x != N; ++x)
{
for (y = 0; y != N; ++y)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
return 0;
}`