题目描述:
有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,程序输出正确