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

来源:百度文库 编辑:高考问答 时间:2024/05/03 23:37:40
那个大兄弟在C++有研究啊,我门老师在搞我们啊!
眼看毕业,全赖兄弟成全啊
能帮俺写出程序最好呀!

随便用java写了一个,没时间调试了,中间有一些可以写成method,懒了一下,大概应该如此吧

public class baidu {

public static void main(String[] args) {
// TODO code application logic here
int i,j,max_row=0,min_col=0;
int col_no=0,row_no=0;
int baidu[][]={{30,35,26,32},{33,34,30,29},{18,21,45,36},{30,11,22,33}};
for(i=0;i<baidu.length;i++)
{
max_row=baidu[i][0];
for(j=0;j<baidu[i].length;j++)//找出本行最大
{
if(max_row<baidu[i][j])
{
max_row=baidu[i][j];
col_no=j; //记录列坐标
row_no=i; //记录行坐标
}
}

//判定是否本列最小
min_col=max_row;
for(j=0;j<baidu.length;j++)
{
if(min_col>baidu[j][col_no])
min_col=baidu[j][col_no];
}
if((max_row==min_col)&&(col_no==j))
System.out.println("The point is baidu["+row_no+"]["+col_no+"]");
}
}

}

//求一个m*n矩阵的鞍点,将位置下标存储在i,j,返回值为鞍点的值
//若找不到鞍点,返回0,同时将i,j置为-1
//注意:这里将二维数组当成一维传入,是为了方便处理
//因为C++对二维数组作函数参数有限制
//要访问a的第i行j列元素,使用a[i*n+j]来访问
//数组元素下标从0开始,而不是1
int saddle(int *a, int m, int n,int *i,int *j)
{
int x,y;
int max,min;
for (x=0;x<m;x++)
{
*i = x;
*j = 0;
max = a[x*n];
for (y=0;y<n;y++) //先找每行最大的元素
{
if (a[x*n+y]>max)
{
max = a[x*n+y];
*j = y;
}
}
min = max;
for (y=0;y<m;y++)
{
if (a[y*n+(*j)]<min)
{
min = a[y*n+(*j)];
break; //若不是列上最小则break;
}
if (max == min) //判断最到的行最大和列最小是否相等
{
return max;
}
}
*i = -1;
*j = -1;
return 0; //没有找到
}
在main中调用
main()
{
int a[3][4]={1,2,3,7;6,4,2,8;9,10,16,1} //这是你要的数组,自己修改
int i,j;
int value;
//注意调用格式,有个强制类型转换,还有i,j要取址
value = saddle((int*)a, 3, 4, &i, &j);
if (value)
{
cout<<"The Saddle is A["<<i<<"]["<<j<<"]=="<<value<<endl;
}
else
{
cout<<"There is no Saddle"<<endl;
}
return 0;
}

这个程序有一个小问题,不能求值为0的鞍点,不过将就用吧。