一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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
#include<stdio.h>
int main(void)
{
//数组的创建与输入
int num;
scanf("%d",&num);
int array[num][num];
for(int i=0;i<num;i++)
{
for(int j=0;j<num;j++)
{
scanf("%d",&array[i][j]);
}
}
//找到每行中的最大值
int record;
int flag;
int flag2=0;
for(int i=0;i<num;i++)
{
flag=0;
record=0;
for(int j=0;j<num;j++)
{
if(array[i][j]>=array[i][record])//如果有更大的下标,那就赋给record
{
record=j;
}
}
//比较这个行中最大的是不是每列中的最小
for(int j=0;j<num;j++)
{
if(array[i][record]>array[j][record])//这里肯定会有i=j的时候,所以有等号会很麻烦
{
flag=1;//如果不是最小就置1
break;
}
}
if(flag==0)//如果确实是最小的,那就输出且有输出就不能是没有了不可以再输出NONE了
{
printf("%d %d\n",i,record);
flag2=1;
}
}
if(flag2==0)//如果一个输出都没有,那就输出NONE
printf("NONE\n");
return 0;
}
按题中的测试虽然能通过,但是,还是有问题的。我的思路是找到每一行中的最大值,再去看这个值是不是这一列的最小值。但是要是一行有多个值相等就比较麻烦了。例如,
4
1 7 7 1
4 8 8 6
1 6 6 2
0 7 9 8
这里只会输出2 2,而不会输出2 1。
由于没有一个令人满意的解决办法,索性不去深究了。