7-2 求矩阵中的逆鞍点 (8 分)
求出n×m二维整数数组中的所有逆鞍点。这里的逆鞍点是指在其所在的行上最大,在其所在的列上最小的元素。若存在逆鞍点,则输出所有逆鞍点的值及其对应的行、列下标。若不存在逆鞍点,则输出“Not”。要求至少使用一个自定义函数。
输入格式:
测试数据有多组,处理到文件尾。每组测试的第一行输入n和m(都不大于100),第二行开始的n行每行输入m个整数。
输出格式:
对于每组测试,若存在逆鞍点,则按行号从小到大、同一行内按列号从小到大的顺序逐行输出每个逆鞍点的值和对应的行、列下标,每两个数据之间一个空格;若不存在逆鞍点,则在一行上输出“Not”(引号不必输出)。
输入样例:
3 3
97 66 96
85 36 85
88 67 91
3 4
73 89 74 76
6 33 74 0
27 57 6 32
输出样例:
85 1 0
85 1 2
Not
#include "stdio.h"
void main()
{
/*
鞍点:
1.该位置上的元素在该行最大;
2.该位置上的元素在该列最小,也可能没有;
*/
int a[][4]={
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10,11,12},
{13,14,15,16}
};
int i,j,min,max,t=0,t2=0;
//打印数组
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
for(i=0;i<4;i++) //行
{
t=0;
max=a[i][0];//初始值
for(j=1;j<4;j++) //求当前行的最大值
{
if(max<a[i][j]){
max = a[i][j];
t = j;//最大值所在的列
}
}
t2=i;//临时保存
min=a[0][t]; //求当前列的最小值
//求第t列的最小值
for(j=0;j<4;j++) //j代表行;
{
if(min>a[j][t])
{
min=a[j][t];
t2=j;
}
}
if(i==t2){//同一行,同一列
printf("%d行的第%d列的%d是鞍点",t2+1,t+1,a[t2][t]);
}
}
}
参考代码
#include <stdio.h>
/*
找出一个二维数组中的鞍点,即该位置上的元素在该行最大,
在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.
*/
int main(void)
{
int a[3][3], max, min, i, j, k, m;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
scanf("%d", &a[i][j]); //输入数组
for (i = 0; i < 3; i++)
{
max = a[i][0]; //给max 赋初始值
for (j = 0; j < 3; j++)
if (a[i][j] > max)
{
max = a[i][j];
k = j; //找到第i行的最大值;
}
min = max; //把max的值作为第k列的最小值
for (m = 0; m < 3; m++) //第k列保持不变,变换行数m
{
if (min > a[m][k]) //若不符合鞍点性质,则break结束
break;
}
if (m == 3)
{
printf("%d %d", i + 1, k + 1); //遍历完当前列,若当前值符合鞍点性质,
break; //则输出鞍 点坐标
}
}
if (i == 3)
printf("%d", -1); //若整个数组遍历完成,还未找到鞍点,则返回-1
return 0;
}
如有帮助,望采纳!谢谢!