【问题描述】
求二维整型数组的"鞍点"。二维数组的"鞍点"定义为:某个数是所在行的最大值,并且是所在列的最小值。
【输入形式】
从控制台读入二维数组。
第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。
然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。
【输出形式】
向控制台输出二维数组的"鞍点",按行下标、列下标从小到大的顺序输出,每行一个,先输出"鞍点"数值,再输出对应的行下标、列下标(下标从1开始),以空格分隔。若没有"鞍点",则输出"No answer"。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void saddle_point(int a[100][100], int n, int m)
{
int min = 0, max = 0; int c = 0;
int count = 0; int i = 0; int t = 0; int j = 0;
int b[4]; int N = 0;
for (i = 0; i < n; i++)
{
max = a[i][0];
for (j = 1; j < m; j++)
{
if (max < a[i][j])
{
max = a[i][j];
}
}
//此时a[i][p]为一行中最大值
//记录同行中最大值的个数
for (int k = 0; k < m; k++)
{
if (max == a[i][k])
{
b[t] = k;
t++;
N++;
}
}
min = max;
for (int x = 0; x < t; x++)
{
for (int K = 0; K < n; K++)
{
if (min > a[K][b[x]])
{
c++;
break;
}
}
if (c==0)//是鞍点
{
printf("%d %d %d\n", min, i + 1, b[x]+1);
}
else
{
count++;
}
c = 0;
}
t = 0;
}
if (count == N)
{
printf("No answer");
}
}
int main()
{
int n = 0;
int m = 0;
int i = 0;
int j = 0;
int k = 0;
int N = 0;
int arr[100][100] = { 0 };
scanf("%d%d", &n, &m);
//输入行
N = n;
for (j = 0; j < n; j++)
{
//输入列
for (k = 0; k < m; k++)
{
scanf("%d", &arr[i][k]);
}
i++;
}
saddle_point(arr, n, m);
return 0;
}