方阵转换1

61 阅读2分钟

` #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;

}`