斜线鞍点→鞍点值求和(C语言)

题目描述:

有1个n×n的矩阵,从左上到右下称为主斜线(倾角135º),从右上到左下称为次斜线(倾角45º)在主斜线上最大,次斜线上最小的元素称为该矩阵的斜线鞍点,求出该矩阵所有斜线鞍点的和。

如5×5的矩阵:

 元素7为上面矩阵的一个斜线鞍点,元素10和19也是上面矩阵的斜线鞍点。

输入

输入一个整数n(1≤n≤100),接下去是n行×n列的矩阵,矩阵的每个元素都是整数。

输出

输出1个整数,即该矩阵所有斜线鞍点的和。

 

思路:分别找出各个斜线上的最大值和最小值并且根据下标赋予给2个二维数组在下标相同的前提下,两个数组上最大值与最小值相等,即为符合鞍点要求
 

#include <stdio.h>
int main()
{
	int a[100][100] = { 0 };
	int n, i, j, k;  //i,j代表数组的行列,n代表输入阶数,k代表偏移量
	int Q, W, E, R; //作为对比的起始点
	int sum=0; //鞍点数值的综合
	int y=0,x=0,m=0;//独立于i,j外的x作为行计数器,y为列计数器
	scanf_s("%d", &n);
	int max[100][100] = { 0 }; //定义两个二维数组,与输入的二维数组 a 进行对应,其中max数组赋予最大值,min赋予最小值
	int min[100][100] = { 0 }; //由于sum+=鞍点数值,为了确保数组元素是否满足鞍点要求,就要利用max==min的判断
	                           //而定义两个数组中没有赋予的值为零的时候,即使max,min相等,也不会影响sum的结果,因为sum+=0依旧等于sum
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++)
			scanf_s("%d", &a[i][j]);    //输入数组
	}
	for (k = 0; k < n; k++) {    //k作为偏移量,要用于确定斜线上各个元素对比时的起点,每完成一条斜线的对比发生改变+1
		Q = k;                   //Q与W用来定义最大值下标的初始值,也就是定义为元素对比的起点
		W = 0;
		for (i = k, j = 0; i < n; i++, j++)  //找斜线最大值 (根据每一条斜线中的对比规律,进行i,j的变换)
		{
			if (a[i][j] > a[Q][W]) { Q = i; W = j; } //令每一个斜线上的数组元素与最大值下标指向的数组元素对比
		}                                            //若大于最大值下标指向的数组元素,则把下标更改为当前对比的数组元素的下标
		max[Q][W] = a[Q][W];       //对比完整条线,得到该斜线上的最大值元素,把它的值赋予给max数组,并且下标要互相对应
	}
	for (k = 1; k < n; k++) {       //思路同上
		Q = 0;
		W = k;
		for(i=0,j=k;j<n;i++,j++)
		{
			if (a[i][j] > a[Q][W]) { Q = i; W = j; } //找到一个斜线的最大值的下标
		}
		max[Q][W] = a[Q][W];
	}
	for (k = 0; k < n; k++) {
		E = k;
		R = n - 1;
		for (i = k,j=n-1; i < n; i++, j--)
		{
			if (a[i][j] < a[E][R]) 
			{ E = i ; R = j; }//找到一个斜线的最小值的下标
		}
		min[E][R] = a[E][R];
	}
	for (k = n - 2; k >= 0; k--) {
		E = 0;
		R = k;
		for (i = 0, j = k; j >= 0; i++, j--)
		{
			if (a[i][j] < a[E][R]) {
				E = i;
				R = j;
		     } //找到一个斜线的最小值的下标
		}
		min[E][R] = a[E][R];
	}
	printf("\n");
	for (x = 0; x < n; x++) {
		for (m = 0; m < n; m++) printf("%2d ", max[x][m]);    //为了便于验证数组的赋予有无错误,我们输出max数组
		printf("\n");                  
	}
	printf("\n");
	for (x = 0; x < n; x++) {
		for (m = 0; m < n; m++) printf("%2d ", min[x][m]);     //输出min数组
		printf("\n");
	}
	printf("\n");
	for (x = 0; x < n; x++) {
		for (m = 0; m < n; m++) { 
			if (max[x][m] == min[x][m]) sum += max[x][m];    //只有在同一个下标指向并且值相同的元素,才能符合鞍点要求
		}                                                    //一旦符合要求,则sum+=max[x][m] (也可以是min)
	}
	printf("%d", sum);      //输出结果

}

我们根据 样例① 中的数值进行输入

得出结果为

 在max数组中的[0][4]与min数组中[0][4],两个数组的[2][3]与[2][4]相等

sum=10+19+7=36

结果为36,程序输出正确

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值