#include<stdio.h>
int main() {
int a[3][3],i,j,hang,lie,max,d; //定义2维数组
for(i=0; i<=2; i++)
for(j=0; j<=2; j++)
scanf("%d",&a[i][j]);//给数组赋值
for(i=0; i<=2; i++) {
max=a[i][0];
hang=i,lie=0;
for(j=0; j<=2; j++) {
if(a[i][j]>max) {
max=a[i][j];
hang=i,lie=j; //确定出每行的最大值
}
d=0;
for(i=0; i<=2; i++)
if(max>a[i][lie])
d=1; //判断此元素是否为该列最小值
if(d==0)
printf("%d为鞍数\n%d为行数\n%d为列数\n",max,hang,lie);//输出 结果
}
}
if(d)
printf("没有鞍数\n");//输出结果
return 0;
}
#include<iostream>
using namespace std;
/* 求一个n×m数组中的马鞍数,并输出它的位置。
马鞍数:指矩阵n*m中,在行上最小而在列上最大的数 */
#define N 100
int main()
{
int n, m; // 行数和列数
int a[N][N]; // 二维数组
int value, row, col; // 马鞍数及其所在行号和列号
int flag = 0; // 马鞍数是否存在的标志,0表示不存在,1表示存在
cout << "请分别输入数组的行数和列数:";
cin >> n >> m;
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++)
cin >> a[i][j];
for (int i = 0;i < n;i++)
{
int min = a[i][0];
row = i;
col = 0;
for (int j = 1;j < m;j++)
{
if (a[i][j] < min)
{
min = a[i][j];
col = j;
}
}
int max = a[0][col];
for (int k = 0;k < n;k++)
{
if (a[k][col]>max)
{
max = a[k][col];
}
}
if (max == min)
{
flag = 1;
value = max;
cout << "马鞍数为:" << value << " ";
cout << "在数组中的位置是:" << i + 1 << "行" << col + 1 << "列" << endl;
}
}
if (!flag)
cout << "该数组不存在马鞍数!" << endl;
system("pause");
return 0;
}
思路:先找到一行中的最小值,确定了最小值以及所在列号,在从该列找最大值,如果在这一列中找到的最大值与之前找到的最小值相等,就说明这个数为马鞍数,确定所在行数和列数
假设在同一行里,你有两个相同的最大数,但是你的程序只判断了第一个出现最大数的那一列,而那一列不一定是答案所在的列。
你这个i都被你给改变了,你要么在后面加一个i=hang
供参考:
#include<stdio.h>
int main()
{
int a[3][3], i, j, max, d, k, flg = 0; //定义2维数组
for (i = 0; i <= 2; i++)
for (j = 0; j <= 2; j++)
scanf("%d", &a[i][j]);//给数组赋值
for (i = 0; i <= 2; i++) {
max = a[i][0];
for (j = 0; j <= 2; j++) {
if (a[i][j] > max)
max = a[i][j]; //确定出每行的最大值
}
for (j = 0; j <= 2; j++) {
if (a[i][j] == max) {
d = 0;
for (k = 0; k <= 2; k++)//for (i = 0; i <= 2; i++)
if (max > a[k][j])
d = 1; //判断此元素是否为该列最小值
if (d == 0){
flg++;
printf("%d为鞍数\n%d为行数\n%d为列数\n", max, i, j);//输出 结果
}
}
}
}
if (flg == 0)
printf("没有鞍数\n");//输出结果
return 0;
}