虽然我写的代码很啰嗦,但看不出逻辑错在哪,有人帮忙看看吗
#include
int main()
{
int i , j , x , y , t , m , k , n ;
int a[4][5] ;
int c = -1 , b = -1 ;
scanf( "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d" , &a[0][0] , &a[0][1] , &a[0][2] , &a[0][3] , &a[0][4] , &a[1][0] , &a[1][1] , &a[1][2] , &a[1][3] , &a[1][4] , &a[2][0] , &a[2][1] , &a[2][2] , &a[2][3] , &a[2][4] , &a[3][0] , &a[3][1] , &a[3][2] , &a[3][3] , &a[3][4] ) ;
for( i = 0 ; i <=3 ; i ++ )
{
for( j = 0 ; j <= 4 ; j ++ )
{
for( k = 0 ; ( k <= 4 ) && ( m >= 0 ) ; k ++ )
{
m = ( a[i][j] - a[i][k] ) ;
}
if( ( k == 4 ) && ( m >= 0 ) )
{
b = j ;
}
for( t = 0 ; ( t <= 3 ) && ( n <= 0 ) ; t ++ )
{
n = ( a[i][b] - a[t][b] ) ;
}
if( ( n <= 0 ) && ( t == 3 ) )
{
c = i ;
}
}
}
if( ( c != -1 ) && ( b != -1 ) )
{
printf( "a[%d][%d]=%d" , c , b , a[c][b] ) ;
}
else
{
printf( "None" ) ;
}
return 0 ;
}
寻找靶点的逻辑有点不对,用(k == 4 ) && ( m >= 0) 和( n <= 0 ) && ( t == 3 ) 来寻找靶点不适合,因为没有先计算出此行的最大点,再计算此数是当前列最小点。
修改如下:
#include<stdio.h>
int main()
{
int i , j , x , y , t , m , k , n ;
int mi; // 靶点的列下表
int ni; // 靶点的行下标
int find=0; // 数组默认无靶点
int a[4][5] ;
int c = -1 , b = -1 ;
scanf( "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d" , &a[0][0] , &a[0][1] , &a[0][2] , &a[0][3] , &a[0][4] , &a[1][0] , &a[1][1] , &a[1][2] , &a[1][3] , &a[1][4] , &a[2][0] , &a[2][1] , &a[2][2] , &a[2][3] , &a[2][4] , &a[3][0] , &a[3][1] , &a[3][2] , &a[3][3] , &a[3][4] ) ;
for( i = 0 ; i <=3 ; i ++ )
{
m=a[i][0];
mi=0;
ni=i;
int rowsEqual=1;
for( j = 1 ; j <= 4 ; j ++ )
{
if(m<a[i][j]){ // 如果当前行找到比当前值大的数,则将靶点设置为此点
// printf("m=%d,a[%d][%d]=%d,m<a[i][j]\n",m,i,j,a[i][j]);
rowsEqual=0;
m=a[i][j];
mi=j;
ni=i;
continue;
}
if(m==a[i][j]){ //处理最大值有几个的情况,如果有和当前靶点值相同的数,则将标志此行有相等最大值设置为1
// printf("m=%d,a[%d][%d]=%d,m==a[i][j]\n",m,i,j,a[i][j]);
rowsEqual=1;
}
}
int colsMin=1; // 列最小值标志,默认为1,即此值在该列为最小
for( t = 0 ; t <= 3 ; t ++ )
{
if(m>=a[t][mi]&&t!=ni){ //如果此列其他行,找到比此值小的值,则将 列最小值标志设置为0,即此值不是该列最小
// printf("m=%d,a[%d][%d]=%d,m<a[i][j],m>=a[t][mi]\n",m,t,mi,a[t][mi]);
colsMin=0;
break;
}
}
if(colsMin==1&&rowsEqual==0){ // 如果当前值为列最小,且在此行没有相同的最大值,则打印其坐标与其值
find=1; // 找到靶点,标志置1
printf("a[%d][%d]=%d\n",ni,mi,a[ni][mi]);
}
}
if(find==0){ //如果遍历完整个数组,未找到靶点,则打印None
printf("None");
}
return 0 ;
}