描述:
输入一个正整数m(1<= m <= 6)和m阶方阵A中的元素,如果找到A中的鞍点(鞍点的元素值在该行上最大,在该列上最小),就输出它的下标;否则,输出"NONE"(没有鞍点),设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
样例输出
NONE
思路及分析:
用二维数组来做这道题会减小我们的难度。同时,先求出每一行的最大值,再在这一个元素的这一列来判断它是不是最小的,对它们进行判断。最后打印出这个元素的下标就可以了。同时还要注意,在样例中输入4和矩阵里的元素时发现,有重复的值(1)的时候,就算他是最小的,但因为重复,不符合鞍点的定义,所以,还需要判断是否有重复的值。另外,题目说明,鞍点最多只有一个。要注意的是,有的和它相似的题目如PTA上面的求鞍点的题目没有说明当这一行有重复的值的情况。所以,先提交带有判断重复值的代码,如果有答案错误,就注释掉重复值判断的代码。版本2对版本1进行了优化。
//版本1
#include<stdio.h>
int main(void)
{
int i = 0, j = 0;
int n = 0;
int arr[6][6] = { 0 };
//最大值最小值
int max = 0;
int min = 0;
//记录列和行
int row = 0;
int col = 0;
//标签作用,当_bool为1的时候,输出坐标,否则输出NONE;
int _bool = 1;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
for(i = 0; i < n; i++)
{
//假设最大值为每一行的第一个元素
max = arr[i][0];
//找这一行的最大值
for(j = 0; j < n; j++)
{
if(arr[i][j] > max)
{
//如果找到,就记录最大值,同时更新他的下标
max = arr[i][j];
col = j;//行
}
}
//鞍点是这一行的最大值,也是这一列的最小值
//让他成为最小值来进行后面的判断.
min = arr[i][col];
for(j = 0; j < n; j++)
{
//判断最小值,除去了他本身.
if(arr[j][col] < min)
{
//更新最小值的值和下标
min = arr[j][col];
row = j;
_bool = 0;
}
}
//最大值和最小值是否相等,是的话,要判断是否有重复的值
if(max == min)
{
_bool = 1;
//这一行判断重复的值
for(j = 0; j < n; j++)
{
if(arr[i][j] == arr[i][col] && j != col)
{
//有重复的值,就让标签成为0;
_bool = 0;
}
}
break;
}
else
{
_bool = 0;
}
}
//若为1,打印,否则,不打印
if(_bool == 1)
{
printf("%d %d", row, col);
}
else
{
printf("NONE");
}
return 0;
}
//版本2
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
int arr[6][6] = { 0 }, i = 0, j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &arr[i][j]);
}
}
// 题目保证给出的矩阵最多存在一个鞍点
int max = 0, row = 0, col = 0,_bool = 0;
for (i = 0; i < n; i++)
{
//记录
_bool = 1;
//假设每一行最大值为第一个元素
max = arr[i][0];
//列为0
col = 0;
for (j = 0;j < n;j++)
{
if (arr[i][j] >= max)
{
max = arr[i][j];
col = j;
row = i;
}
}
//判断一行是否有重复的值
for(j = 0; j < n; j++)
{
if(arr[i][j] == arr[i][col] && j != col)
{
//有重复的值,就让标签成为0;
_bool = 0;
}
}
//同列比较
for (j=0;j<n;j++)
{
//鞍点的定义是一行最大,一列最小
//所以直接让他和这一列比较。省去了找最小值,更新最小值的下标
//如果他比这一列的某个值大,说明不是;
if (max > arr[j][col])
{
_bool = 0;
break;
}
}
if (_bool == 1)
{
printf("%d %d",i,col);
break;
}
}
if (!_bool)
{
printf("NONE");
}
return 0;
}