本题代码如下:
#include <stdio.h>
int main()
{
int a[5][4];
int i,j,k;
int max,min,row,column;
printf("Please enter figures:\n");
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<5;i++)
{
max=a[i][0];
column=0;
for(j=0;j<3;j++)
{
if(max<a[i][j+1])
{
max=a[i][j+1];
column=j+1;
}
}
printf("\nmax=%d,column=%d\n",max,column);
min=a[0][column];
row=0;
for(k=0;k<4;k++)
{
if(min>a[k+1][column])
{
min=a[k+1][column];
row=k++;
}
}
printf("\nmin=%d,row=%d\n",min,row);
if(max!=min)
{
if(i>=4) printf("\nThere is no saddle point for this array\n");
}
else
{
printf("\n%d is the saddle point of this array\n",a[row][column]);
break;
}
}
return 0;
}
但是它只适用于鞍点在第一行的情况,试问哪里出了问题?
题主写的逻辑感觉有点混乱,按照题目意思就是找到一个元素,该元素在行中是最大,列中是最小。
下面是我写的代码:
#include <stdio.h>
int main()
{
int a[5][4];
int i,j,k;
int max,min,row,column;
printf("Please enter figures:\n");
for(i=0;i<5;i++){
for(j=0;j<4;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<5;i++){
max = a[i][0];
//寻找每一行的最大值及位置
for(j = 1;j < 4;j++){
if(max < a[i][j]){
max = a[i][j];
row = i;
column = j;
}
}
// 寻找该最大值所在列是否为最小值,确定是否为 鞍点
bool flag = true;
for(k = 0;k < 5;k++){
if(a[k][column] < max){
flag = false;
printf("\nThere is no saddle point for this array[%d]\n",i);
break;
}
}
if(flag)
printf("\n%d is the saddle point of this array[%d]\n",max,i);
}
return 0;
}
测试时候自己构造样例就行。
4 5 3 1
2 6 7 9
6 7 4 2
4 8 9 2
1 4 1 2
#include <stdio.h>
#include <stdlib.h>
#define M 4
#define N 3
int main()
{
int a[M][N];
printf("Please Enter 12 figures:\n");
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
scanf("%d",*(a+i)+j);
}
}
int i,j,k,p,flag;
int max_x,max_y;
for(i=0;i<M;i++)
{
p=0;//找出行最大值的坐标。
for(j=1;j<N;j++)
{
if(a[i][p]<a[i][j])
p=j;
}
max_x=p;
max_y=i;
flag=1;//判断行最大值是否为列最小值
for(k=0;k<M;k++)
{
if(a[max_y][max_x]>a[k][max_x])
flag=0;
}
if(flag)
printf("(%d,%d)\n",max_y,max_x);
else
printf("No point!\n");
}
}