问题描述:
找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。
我的思路:
1,首先找出第一行中的最大值。
2,然后再找出当前行中与最大值相等的值(即一行中出现多个最大值的情况)
3,把找到的最大值及其所在列保存到数组中。
4,依次扫描最大值所在列有没有更小的值。
5,如果没有则打印当前鞍点。
测试结果:
主要代码:
void JZAD(int a[][4],int m,int n){
int max[10],k[10],l;//用于存放当前行的最大值及其列号,l为下标
for(int i=0;i<m;i++){//逐行处理
l=0; max[l]=a[i][0]; k[l]=0; //初始化为第一个元素
for(int j=1;j<n;j++){//查找当前行最大值并储存
if(a[i][j]>max[l]){//如找到更大的,则替换
max[l]=a[i][j];
k[l]=j;
}
} //这一轮可确定当前行中列号较小的最大值,
// printf("==a[%d][%d]=%d\n",i,k[l],max[l]);
//如果有多个最大值,必然在此最大值之后,且等于当前最大值
for(int j=k[l];j<n;j++){
if(a[i][j]==max[l]&&j!=k[l]){//如果有多个相同的最大值
max[++l]=a[i][j];
k[l]=j; //注意不要重复后移下标 l
// printf("==a[%d][%d]=%d\n",i,k[l],max[l]);
}
} //这一轮可以找出当前行的所有最大值,
while(l!=-1){//l 代表了每个最大值的下标 l+1为最大值的个数
int j;
for(j=0;j<m;j++) {//验证行最大值是不是列最小值
if(a[j][k[l]]<max[l]) //如果当前列有更小的元素,则验证失败
break;
}//验证完一个;
if(j==m) printf("a[%d][%d]=%d\n",i,k[l],max[l]);
//验证成功,打印
l--;//下标前移,查找下一个
// printf("=%d=\n",l);
}
}
}
主函数部分:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void JZAD(int[][4],int m,int n);
main()
{
int a[][4]={6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
JZAD(a,4,4);
return 0;
}
希望对你有所帮助!
封面