matlab查找鞍点的位置,找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该...

/* 二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点

二维数组鞍点判断,要逐个要素进行确认,并用二维数组记录满足各要素时的坐标,

之后进行各性质重合对比来确定,也就是说,先分别找到各行的最大数字位置,和各列最小数字位置

再进行重合对比两性质下的坐标,一样,说明点重合,有鞍点,否则,没有鞍点*/

#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)

你可能感兴趣的:(matlab查找鞍点的位置)