【C/C++】5*5的矩阵中最大的元素放在中心 四个角分别放四个最小的元素

将一个5*5的矩阵中最大的元素放在中心, 四个角分别放四个最小的元素(顺序从左到右,从上到下顺序依次从小到大存放),写一个函数实现之。用main函数调用。

原矩阵为:
35 34 33 32 31
30 29 28 27 26
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11
改变后的矩阵:
11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 19 18 17 16
13 23 15 31 14

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

void swap(int *a, int *b);
void transform(int *arry, int col_row);
void prinArry(int *arry, int col_row);

int main() {
	int b[5][5] = { 35 ,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11 };
	/*printf("Please enter a 5x5 matrix: \n");
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			scanf_s("%d", &b[i][j]);
		}
	}*/
	printf("变换前:\n");
	prinArry(*b, 5);
	transform(*b, 5);//将二维数组当做一维数组传入处理,并且传入行列数
	printf("\n");
	printf("变换后:\n");
	prinArry(*b, 5);
	system("pause");
	return 0;
}

void swap(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}
void transform(int *arry, int col_row)
{
	int max = arry[0], min0 = arry[0], min1 = arry[0], min2 = arry[0], min3 = arry[0];
	int max_idx = 0, min_idx[4];
	for (int i = 0; i < col_row*col_row; i++)
	{
		if (arry[i] > max)
		{
			max = arry[i];
			max_idx = i;
		}
		if (arry[i] < min0)
		{
			min3 = min2;
			min2 = min1;
			min1 = min0;
			min0 = arry[i];
			min_idx[3] = min_idx[2];
			min_idx[2] = min_idx[1];
			min_idx[1] = min_idx[0];
			min_idx[0] = i;
		}
	}
	int center_idx = (col_row * col_row) / 2;//获取中心点下标
	swap(&arry[center_idx], &arry[max_idx]);
	//int tmp = arry[center_idx]; arry[center_idx] = arry[max_idx]; arry[max_idx] = tmp;//将最大值交换到中心位置

	int change_idx[4];//先计算四个角的下标,便于后边进行交换
	change_idx[0] = 0;//第一个要置换的数据的下标,也就是左上角
	change_idx[1] = col_row - 1;//第二个要置换的数据的下标,也就是右上角
	change_idx[2] = col_row * (col_row - 1);//第一个要置换的数据的下标,也就是左下角
	change_idx[3] = (col_row * col_row) - 1;//第一个要置换的数据的下标,也就是右下角
	//将4个最小值一次交换到四个角落
	for (int i = 0; i < 4; i++) {
		//int tmp = arry[change_idx[i]]; arry[change_idx[i]] = arry[min_idx[i]]; arry[min_idx[i]] = tmp;
		swap(&arry[change_idx[i]], &arry[min_idx[i]]);
	}
	return;
}

void prinArry(int *arry, int col_row) {
	for (int i = 0; i < col_row; i++)
	{
		for (int j = 0; j < col_row; j++)
		{
			printf("%d ", *(arry + (i * col_row) + j));
		}
		printf("\n");
	}
}

运行结果:
在这里插入图片描述

codeSample.c文件 下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值