二维数组求鞍点 ---- 2015/9/29

来源:互联网 发布:淘宝女鞋正品 编辑:程序博客网 时间:2024/05/19 02:00

鞍点 :行中最大,列中最小

定义整型二维数组[4][3]并附随机值([10 , 30]),求鞍点.

方法一:

<span style="font-size: 18px;">   </span>int array[4][3];    int minColumn[] = {31};    int maxRow[4] = {0};    for (int i = 0; i < 4; i++) {        for (int j = 0 ; j < 3; j++ ) {            array[i][j] = arc4random() % (  30 - 10 + 1 ) + 10;            printf("%d\t", array[i][j]);        }        printf("\n");    }    for (int i = 0 ; i < 4 ; i++) {        for (int j = 0; j < 3; j++) {            maxRow[i] = ( array[i][j] > maxRow[i] ) ? array[i][j] : maxRow[i];        }    }    for (int i = 0 ; i < 3 ; i++) {        for (int j = 0; j < 4; j++) {            minColumn[i] = ( array[j][i] < minColumn[i] ) ? array[j][i] : minColumn[i];        }    }    int count = 0;    for (int i = 0; i < 4; i++) {        for (int j = 0; j < 3 ; j++) {            if ( maxRow[i] == minColumn[j] ) {                printf("第%d行,第%d列为鞍点,值为:%d\n", i + 1, j + 1, array[i][j]);                count++;            }        }    }    printf("该二维数组共有%d个鞍点!!!\n", count);
方法二:

    int array[4][3];    int count = 0;    for (int i = 0; i < 4; i++) {        for (int j = 0 ; j < 3; j++ ) {            array[i][j] = arc4random() % (  30 - 10 + 1 ) + 10;            printf("%d\t", array[i][j]);        }        printf("\n");    }    for (int i = 0; i < 4; i++) {        for (int j = 0 ; j < 3 ; j++) {            int  max = array[i][j];//假设当前点是该行最大值            for (int column = 0; column < 3; column++) {                if (max < array[i][column]) {                    break;                } else if (column < 2) {                    continue;                } else {                    int min = array[i][j];                    for (int row = 0; row < 4; row++) {                        if (min > array[row][j]) {                            break;                        } else if (row < 3) {                            continue;                        } else if(row == 3) {                            printf("鞍点: %d,所在第%d行,第%d列\n", array[i][j], i + 1, j + 1 );                            count++;                        }                    }                }            }        }    }    if (0 == count) {        printf("该数组不存在鞍点!!!\n");    }


方法三:

    int array[4][3];    int count = 0;    for (int i = 0; i < 4; i++) {        for (int j = 0 ; j < 3; j++ ) {            array[i][j] = arc4random() % (  30 - 10 + 1 ) + 10;            printf("%d\t", array[i][j]);        }        printf("\n");    }    for (int i = 0; i < 4; i++) {        for (int j = 0 ; j < 3 ; j++) {            //假设当前值就是鞍点            //验证:            //验证一:            int  max = array[i][j];//假设当前点是该行最大值            //验证: 是不是该行最大值            BOOL isMax = YES;//Yes 为真,代表当前的点是鞍点            for (int column = 0; column < 3; column++) {                //判断是不是该行最大值                if (max < array[i][column]) {                    //能够进入该分支内部,代表当前值不是该行最大的值,就不是鞍点                    isMax = NO;                    break;                }            }            if (isMax == NO) {                continue;            }            //验证二: 该点是该列最小的            int min = array[i][j];            BOOL isMin = YES;//假设是该列中最小的            //验证是该列最小的.            for (int row = 0; row < 4; row++) {                if (min > array[row][j]) {                    //如果,一旦发现该行中还有数值,比当前的值 min 小,说明当前值不是最小的,不是鞍点.                    isMin = NO;                    break;                }            }            if (! isMin) {                continue;            }            //程序能够执行到该行,意味着该点就是鞍点            printf("鞍点: %d,所在第%d行,第%d列", array[i][j], i + 1, j + 1 );            count++;        }    }    if (0 == count) {        printf("该数组不存在鞍点!!!\n");    }
个人认为方法一较易理解...

1 0