首页 > 试题广场 >

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

[问答题]

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

推荐

#include<stdio.h>

#define N 4

#define M 5                               /*数组为4行5列*/

int main( )

{

int i,j,k,a[N][M],max,maxj,flag;

printf("please input matrix:\n'");

for (i=0;i<N;i++)                            /*输入数组*/

for(j=0;j<M;j++)

scanf("%d",&a[i][j];

for (i=0;i<N;i++)

{max=a[i][0];                              /*开始时假设a[i][0]最大*/

maxj=0;                                  /*将列号0赋给maxj保存*/

for(j=0;j<M;j++)                             /*找出第i行中的最大数*/

if(a[i][j]>max)

{max=a[i][j];                              /*将本行的最大数存放在max中*/

maxj=j;                            /*将最大数所在的列号存放在maxj中*/

}

flag=1;                               /*先假设是鞍点,以flag为1代表*/

for(k=0;k<N;k++)

if(max>a[k][maxj])                    /*将最大数和其同列元素相比*/

{flag=0;               /*如果max不是同列最小,表示不是鞍点令flag1为0*/

continue;}

if (flag)                        /*如果flag1为1表示是鞍点*/

{printf("a[%d][%d]=%d\n",i,maxj,max);      /*输出鞍点的值和所在行列号*/

break;

}

}

if(!flag)                        /*如果flag为0表示载点不存在*/

printf("It is not exist!\n”);

return 0;

}


发表于 2018-03-25 10:36:56 回复(0)
/* 二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点
二维数组鞍点判断,要逐个要素进行确认,并用二维数组记录满足各要素时的坐标,
之后进行各性质重合对比来确定,也就是说,先分别找到各行的最大数字位置,和各列最小数字位置
再进行重合对比两性质下的坐标,一样,说明点重合,有鞍点,否则,没有鞍点*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
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)
#include<stdio.h>  5 #define M 3  6 #define N 3 //定义行和列的大小  7  8 int main()  9 { 10 int a[M][N]; 11 int i, j; 12 int temp = 1, temp1[M], temp2[N]; 13 printf("请根据提示输入二维数组。\n"); 14 //输入数组 15 for (i = 0;i<M;i++) 16 for (j = 0;j < N;j++) 17  { 18 printf("a[%d][%d]=", i, j); 19 scanf_s("%d", &a[i][j]); 20  } 21 //输出数组 22 for (i = 0;i < M;i++) 23  { 24 for (j = 0;j < N;j++) 25 printf("%d\t", a[i][j]); 26 printf("\n"); 27  } 28 //处理数组 29 for (i = 0;i < M;i++) 30  { 31 temp1[i] = a[i][0]; //给每行的最大值赋一个初始值 32 temp2[i] = a[0][i]; //给每列的最小值赋一个初始值 33 for (j = 0;j < N;j++) 34  { 35 if (temp1[i] < a[i][j])    temp1[i] = a[i][j]; 36 if (temp2[i] > a[j][i])    temp2[i] = a[j][i]; 37  } 38  } 39 for (i = 0;i < M;i++) 40  { 41 for (j = 0;j < N;j++) 42  { 43 if (a[i][j] == temp1[i] && a[i][j] == temp2[j]) 44 printf("这个二维数组的鞍点为%d\n", a[i][j]); 45 else 46 temp = 0; 47 48  } 49  } 50 if (temp == 0) 51 printf("这个数组中没有鞍点.\n"); 52 }
发表于 2019-05-15 21:43:10 回复(0)