/* 二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点
二维数组鞍点判断,要逐个要素进行确认,并用二维数组记录满足各要素时的坐标,
之后进行各性质重合对比来确定,也就是说,先分别找到各行的最大数字位置,和各列最小数字位置
再进行重合对比两性质下的坐标,一样,说明点重合,有鞍点,否则,没有鞍点*/
#include
#include
#include
int saddle_point(int **array){
int length = sqrt(sizeof(array)/ sizeof(int));//给出一个二维数组,求每一维长度,假如一维是a 那么用sizeof来求就是分母除以int * a
const int rowlen = length + 1;//求行长度
const int collen = length + 1;//求列长度
int index2[rowlen][collen];//再建一个坐标组记录每行最大的元素坐标
int index1[rowlen][collen];//建一个坐标组记录每列最小的元素坐标
for(int i = 0 ; i < rowlen; i ++){//两个坐标组初始化为零
for(int j = 0; j < collen; j ++){
index1[i][j] = 0;
index2[i][j] = 0;
}
}
int cnt = 1;//从坐标组第一行第二位,第一列第二位开始记录坐标
int row = 0;//这个行,列用来扫描给出的二维数组
int col = 0;
for(col = 0; col < length ; col ++){//这个记录每列最小元素的坐标
for(row = 0; row < length; row ++){
if(array[row][col] < array[row + 1][col]){
index1[cnt][0] = row;//坐标记录在坐标一组,行记在坐标一组的第一竖行
index1[0][cnt] = col;//列记在坐标一组的第一横列
cnt ++;//记录一个位置坐标,就向后移动一位
}
}
}
cnt = 1;
for(row = 0; row < length ; row ++){//记录每行最大元素坐标,记在坐标二组
for(col = 0; col < length; col ++){
if(array[row][col] > array[row][col + 1]){
index2[cnt][0] = row;
index2[0][cnt] = col;
cnt ++;
}
}
}
//之后比较两次坐标组记录各行各列坐标是否重合,重合,说明存在鞍点,没有,说明不存在
for(int i = 0; i < rowlen; i ++){
for(int j = 0; j < collen; j ++){
if(i == 0 && j == 0)//跳过(0,0)点
continue;
if(index1[i][0] == index2[i][0] && index1[0][j] == index2[0][j])
return array[index1[i][0]][index1[0][j]];//如果记录的横纵坐标各行各列都相等,说明重合存在鞍点
}
}
return 0;//循环结束也没return,说明不存在鞍点
}
int main(){
int **matrix;
int n;
scanf("%d", &n);
matrix = (int **)malloc(sizeof(int*) * n );
for(int i = 0; i < n; i ++){
matrix[i] = (int *)malloc(sizeof(int) * n);
}
for(int i = 0 ; i < n; i ++){
for(int j = 0; j < n; j ++){
scanf("%d", &matrix[i][j]);
}
}
if(saddle_point(matrix))
printf("%d\n", saddle_point(matrix));
else
printf("there is no such saddle point\n");
}
发表于 2019-12-31 20:44:22
回复(0)