求一个二维数组的鞍点问题(以6行8列为例):
思路一:找出每一行的最大值位置,每一列的最小值位置,然后检查是否有交叉。
程序实现如下:
int array[6][8]={0};
int max[6]={0},min[8]={0};
int row[6]={0},colum[8]={0};
for (int i=0; i<6; i++) {
for (int j=0;j<8; j++) {
array[i][j]=arc4random()%51+40;
printf("%d ",array[i][j]);
}
printf("\n");
}
//找出每行中的最大值列下标组成数组row[6]
//找出每列中得最小值行下标组成数组colum[8]
printf("\n\n\n");
for (int i=0; i<6; i++) {
int maxRow=0;
for (int j=0; j<8; j++) {
maxRow=maxRow>array[i][j]?maxRow:array[i][j];
}
max[i]=maxRow;
printf("%d ",max[i]);
}
printf("\n\n\n");
//找出每一行最大值元素的下标
printf("行最大值元素位置为:");
for (int i=0; i<6; i++) {
for (int j=0; j<8; j++) {
if (array[i][j]==max[i]) {
row[i]=j;//意思是i行的最大值在第j列
printf("%d ",j);
}
}
}
printf("\n");
//找出每一列最小值元素数组
for (int i=0; i<8; i++) {
int minColum=100;
for (int j=0;j<6; j++) {
minColum=minColum<array[j][i]?minColum:array[j][i];
}
min[i]=minColum;
printf("%d ",min[i]);
}
printf("\n");
//找出每一列最小值元素数组下标
printf("列最小值元素位置为:");
for (int j=0; j<8; j++) {
for (int i=0; i<6; i++) {
if (min[j]==array[i][j]) {
colum[j]=i;//意思是j列的最小值在第i列
printf("%d ",i);
}
}
}
int sum=0;
for (int j=0; j<8; j++)
{
if (row[colum[j]]==j) {
printf("\n鞍点位置arr[%d][%d]",colum[j],j);
sum++;
}
}
if (sum==0)
{
printf("\n不存在鞍点");
}
思路二
思路一:找出每一行的最大值以及最大值位置,然后用这个最大值去跟该列中每个元素进行比较。
程序实现(省略)