鞍点 :行中最大,列中最小
定义整型二维数组[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");
}
个人认为方法一较易理解...