题目描述:
若一个矩阵中的某元素在其所在行最小而在其所在列最大,则该元素为矩阵的一个马鞍点。
请写一个程序,找出给定矩阵的马鞍点。
输入说明
输入数据第一行只有两个整数m和n(0<m<100,0<n<100),分别表示矩阵的行数和列数;
接下来的m行、每行n个整数表示矩阵元素(矩阵中的元素互不相同),整数之间以空格间隔。
输出说明
在一行上输出马鞍点的行号、列号(行号和列号从0开始计数)及元素的值(用一个空格分隔),之后换行;
若不存在马鞍点,则输出一个字符串“no”后换行。
输入样例
4 3
11 13 121
407 72 88
23 58 1
134 30 62
输出样例
1 1 72
#include <stdio.h>
int main() {
int m, n, a[100][100], i, j, flag = 0, max[100], min[100];
scanf("%d%d", &m, &n);
for (i = 0; i < m; i++) { //双重循环,二维数组输入
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < m; i++) { //扫一遍行,找到第i行最小数并记录在min[i]中
min[i] = a[i][0];
for (j = 1; j < n; j++) {
if (a[i][j] < min[i])
min[i] = a[i][j];
}
}
for (j = 0; j < n; j++) { //扫一遍列,找到第j行最大数记录在max[j]中
max[j] = a[0][j];
for (i = 0; i < m; i++) {
if (a[i][j] > max[j])
max[j] = a[i][j];
}
}
for (i = 0; i < m; i++) { //如果a[i][j]即是第i行最小又为第j行最大,则为马鞍点
for (j = 0; j < n; j++) {
if (a[i][j] == max[j] && a[i][j] == min[i]) {
printf("%d %d %d", i, j, a[i][j]);
flag = 1;
}
}
}
if (flag == 0)
printf("no");
}