找出一个二维数组中的“鞍点”,即该位置上的元素在该行中 最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特 殊情况:没鞍点或多个鞍点)
方法一:
void test3_1() { int testArray[3][4]={0}; for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { testArray[i][j]=arc4random()%20+30; } }int maxValue=0; int flag=0; for (int i=0; i<3; i++) { flag=0; for (int j=0; j<4; j++) { if (maxValue<testArray[i][j]) { maxValue=testArray[i][j]; } } for (int k=0; k<4; k++) { if (testArray[i][k]==maxValue) { for (int l=0; l<3; l++) { if (testArray[i][k]>testArray[l][k]) { flag=1; break; } } if (flag==0) { printf("x=%d,y=%d ",i,k); } } } } for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { printf("%d ",testArray[i][j]); } printf(" "); } }
方法二:
void test3_2() { int testArray[3][4]={0}; for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { testArray[i][j]=arc4random()%20+30; } } for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { bool isLineMaxValue=YES; for (int k=0; k<4; k++) { if (testArray[i][j]<testArray[i][k]) { isLineMaxValue=NO; break; } } if (isLineMaxValue==NO) { continue; } BOOL isColumnMinValue=YES; for (int l=0; l<3; l++) { if (testArray[i][j]>testArray[l][j]) { isColumnMinValue=NO; } } if (isColumnMinValue==NO) { continue; } printf("testArray[%d][%d]=%d是鞍点 ",i,j,testArray[i][j]); } } for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { printf("%d ",testArray[i][j]); } printf(" "); } }
说明:方法一和方法二都可以正确打印出鞍点,唯一不同的地方就是判断元素是否是当前行的最大值,第一种方法比第二种方法的效率要高,第二种方法的话,每一个元素都要跟改行中的其他所有元素比较,而第一种只需要在求出最大值后跟最大值进行比较即可,第二种的循环次数大于第一种循环,所以第一种的效率较高。