二维数组的鞍点问题

找出一个二维数组中的“鞍点”,即该位置上的元素在该行中 最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特 殊情况:没鞍点或多个鞍点) 

方法一:

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("
");
    }
}

说明:方法一和方法二都可以正确打印出鞍点,唯一不同的地方就是判断元素是否是当前行的最大值,第一种方法比第二种方法的效率要高,第二种方法的话,每一个元素都要跟改行中的其他所有元素比较,而第一种只需要在求出最大值后跟最大值进行比较即可,第二种的循环次数大于第一种循环,所以第一种的效率较高。

原文地址:https://www.cnblogs.com/haili/p/3930966.html