将一个5*5的矩阵中最大的元素放在中...

将一个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;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT物联网小镇

赏点银子去植发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值