// 求矩阵的鞍点:行最小,列最大的值
#include <stdio.h>
#include <string.h>
// 输入矩阵
void inputSaddlePoint(int arr[][10],int n) {
int i,j;
for(i = 0; i < n ; i++) {
for (j = 0; j < n ; j++) {
// scanf 中填入二维数组也要加 &
scanf("%d", &arr[i][j]);
}
}
}
// 输出矩阵
void printSaddlePoint(int arr[][10],int n) {
int i,j;
for(i = 0; i < n ; i++) {
for (j = 0; j < n ; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
// 求鞍点
void findSaddlePoint(int arr[][10], int n) {
int i,j,k;
// 标志量
int kz = 0;
// 先找每行上最小的
for (i = 0; i <n; i++) {
// 从第 i 行第一个开始
int t = arr[i][0];
// minj记录每行中最小值所对应的列
int minj = 0;
for (j = 1; j < n; j++) {
// 找到比初始值小的,然后记录它的列号
if (arr[i][j] < t) {
t = arr[i][j];
minj = j;
}
}
// 找列上最大的
for (k = 0; k < n; k++) {
// 如果在同一列有比它大的数,那么就不成立,跳出循环
if (arr[k][minj] > t) break;
}
// 如果循环未结束,也就是 在同一列有比它大的数,那么直接进行下一行的比较
if (k < n) continue;
// 如果循环结束,也就是 该数是满足列上最大的,是鞍点
printf("满足的鞍点是:%d",t);
kz = 1;
break;
}
if (kz == 0) printf("没鞍点!");
}
int main() {
int arr[10][10];
int n;
printf("输入几行几列矩阵:");
scanf("%d", &n);
// 输入矩阵
inputSaddlePoint(arr,n);
// 打印矩阵
printSaddlePoint(arr,n);
// 求鞍点
findSaddlePoint(arr,n);
return 0;
}