万籁无声反义词:C编程 求救.....

来源:百度文库 编辑:高校问答 时间:2024/04/29 03:48:05
找出二维数组的鞍点,即在该行上最大,在该列上最小,也可能没有鞍点. 用N-S流程图表示 或编程....
我的QQ58768537

/*鞍点行最大,列最小*/
int Row,Colum;
void main(){
int a[3][4]={
{ 1, 15, 3, 4},
{ 9, 11, 7, 6},
{-10, 12, -5, 2}
};
int max,i,j,min;
max=a[0][0]; /*求行上最大值*/
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if(a[i][j]>max){
max=a[i][j];
Row=i;
Colum=j;
}
}
for(i=0;i<3;i++){ /*判断行上的最大值是不是列上的最小值*/
if(a[i][Colum]<max)
min=a[i][Colum];
}
if(min==max)
printf("%d",max);
}
getch();
}
--------------------------------------------------------------------------------
1. 第二重循环中使用了i这个第一重循环变量
2. max, colum在外层循环中没有初始化(max会一直保持数组中最大的值)
3. 查找min时,没有初始化(如果恰好是鞍点,min值无定义)

有可能存在多个鞍点,要找出全部的鞍点,可以用如下方法:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define M 3
#define N 4

void saddle_point(int a[M][N])
{
int i, j;
int row_max[M], col_min[N];
for (i = 0; i < M; i++)
row_max[i] = a[i][0];
for (j = 0; j < N; j++)
col_min[j] = a[0][j];
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
{
if (a[i][j] > row_max[i])
row_max[i] = a[i][j];
if (a[i][j] < col_min[j])
col_min[j] = a[i][j];
}
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
{
if (a[i][j] == row_max[i] && a[i][j] == col_min[j])
{
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}
}
}

int main()
{
int a[M][N] =
{
{ 1, 3, 15, 4},
{ 9, 11, 11, 6},
{-10, 11, 11, 2}
};
saddle_point(a);

return 0;
}

运行结果:
a[1][2] = 11
a[2][2] = 11

谭浩强的习题答案中有