描述:
输入一个正整数m(1<= m <= 6)和m阶方阵A中的元素,如果找到A中的鞍点(鞍点的元素值在该行上最大,在该列上最小),就输出它的下标;否则,输出"NO"(没有鞍点),设A中最多有一个鞍点。
输入
3
1 2 3
0 1 2
0 0 1
输出
2 2
样例输入
4
1 2 3 4
0 1 1 3
0 0 1 2
1 0 0 1
样例输出
NO
思路及分析:
用二维数组来做这道题会减小我们的难度。同时,先求出每一行的最大值,再在这一个元素的这一列来判断它是不是最小的,对它们进行判断。最后打印出这个元素的下标就可以了。同时还要注意,在样例中输入4和矩阵里的元素时发现,有重复的值(1)的时候,就算他是最小的,但因为重复,不符合鞍点的定义,所以,还需要判断是否有重复的值。另外,题目说明,鞍点最多只有一个。
#include<stdio.h>
int main(void)
{
int i = 0, j = 0;
int arr[6][6] = { 0 };
int max = 0;//定义最大值
int _bool = 0;//标签作用,用来判断是否有重复值
//最后当_bool=0,说明没有,_bool=1,说明有
int row = 0, col = 0;//行,列
int m = 0;
scanf("%d", &m);
for(i = 0; i < m; i++)
{
for(j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
//由于不知道最大值,开始假设第一行第一列元素是最大的
max = arr[0][0];
for(i = 0; i < m; i++)//一行
{
//假设每一行的第一个元素为最大值
max = arr[i][j];
//寻找每一行的最大值
for(j = 0; j < m; j++)
{
if(arr[i][j] > max)
{
//如果是MAX,就记录它的下标
//不可以直接用i或j,它们是随条件在变
//用另一个量来记录下标
row = j;
_bool = 1;
//记录最大值,在后面的判断用
max = arr[i][j];
}
}
//用来判断这一行的最大值是否有重复的
//如果有,_bool=0,不存在鞍点
for(j = 0; j < m; j++)
{
//循环时不需要判断它本身
if(arr[i][j] == max && j != row)
{
_bool = 0;
}
}
//列的判断,行满足后,找列的最小值。
for(j = 0; j < m; j++)
{
if(arr[i][row] < arr[j][row])
{
col = i;
}
}
}
if(_bool == 0)
{
printf("NO\n");
}
else
{
printf("%d %d", row, col);
}
return 0;
}