一个二维数组a记录矩阵,另一个同样大小的数组b来标记鞍点。
找鞍点就用四个最值排列组合
注意:每一行或者每一列都有两个最值,所以最值也要用数组来储存每行和每列的最值。
#include<stdio.h>
int main()
{
int k,n,m,cnt,lmax[102],lmin[102],hmax[102],hmin[102],i,j;
int a[102][102];
scanf("%d",&k);
while(k--){
cnt=0;
int b[102][102]={0};
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
hmax[i]=a[i][0];
hmin[i]=a[i][0];
for(j=0;j<m;j++){
if(a[i][j]>hmax[i])hmax[i]=a[i][j];
if(a[i][j]<hmin[i])hmin[i]=a[i][j];
}
}
for(j=0;j<m;j++){
lmax[j]=a[0][j];
lmin[j]=a[0][j];
for(i=0;i<n;i++){
if(a[i][j]>lmax[j])lmax[j]=a[i][j];
if(a[i][j]<lmin[j])lmin[j]=a[i][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(a[i][j]==lmax[j]&&a[i][j]==hmin[i]||a[i][j]==hmax[i]&&a[i][j]==lmin[j]){
b[i][j]=1;
cnt++;
}
}
}
if(cnt!=0){
printf("%d\n",cnt);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(b[i][j]==1){
printf("%d %d %d\n",i,j,a[i][j]);
}
}
}
}else{
printf("None\n");
}
}
return 0;
}