一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
思路:
1.找出每一行的最大值max,遍历一遍每一行,将对应最大值坐标存到b数组中, 其间统计每一行相同最大值元素的个数存到数组中。
2.遍历每一行为最外层,次外层为同一行最大元素的个数,内层比较判断是否为该列中的最小元素,如果是则输出,不是则下一轮循环。
3.没有鞍点的情况:在内层判断是否输出中用值记录,根据值的最终大小判断。
完整代码如下(附上注释):
#include <stdio.h>
#include <string.h>
struct position
{
int x;
int y;
};
int main()
{
int n = 0;
scanf("%d", &n);
int a[n][n];
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
int sz = n*n;
struct position b[sz];//记录行最大值元素的坐标
int max_count_row[n];//记录每行最大值的元素的个数
memset(max_count_row,0,sizeof(max_count_row));//初始化为0
int max = 0;
int s = 0;//控制b数组
int t = 0;//控制max_count_row数组
for (i = 0; i < n; i++)
{
max = a[i][0];
for (j = 1; j < n; j++)//找出每行的最大值,存在max中
{
if (a[i][j] > max)
{
max = a[i][j];
}
}
for (j = 0; j < n; j++)
{
if (a[i][j] == max)//如果有元素==最大值
{
b[s].x = i;//将它的行、列坐标存起来
b[s].y = j;
max_count_row[t]++;//记录每行的最大值元素的个数
s++;
}
}
t++;
}
int k = 0;//用来记录b数组
int count = 0;//记录每行的最大值的次数
int i2 = 0;
int ret = 0;
for (i = 0; i < n; i++)//每一行的最大值的每一个元素去判断是否为鞍点
{
for (count = 0; count < max_count_row[i]; count++)
{
for (i2 = 0; i2 < n; i2++)//判断是否为b[k].y列中的最小值
{
if (a[b[k].x][b[k].y] > a[i2][b[k].y])//如果比其他任一元素大,那就不是最小值,跳出来
{
break;
}
}
if (i2 == n)//是鞍点
{
ret = printf("%d %d\n", b[k].x, b[k].y);
}
k++;
}
}
if (ret == 0)
{
printf("NONE");
}
return 0;
}