一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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(){ int n; scanf("%d",&n); //定义矩阵 int a[n][n]; //找"鞍点"使用的坐标 int x=0,y=0; //输入矩阵具体的值 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } //ret用来判断是否存在鞍点,是否输出'NONE' int ret=0; //遍历第i行 for(int i=0;i<n;i++){ //初始化x,y,用a[x][y]预设为最大值 x=i; y=0; //找到第i行最大的数 for(int j=0;j<n;j++){ if(a[i][j]>=a[x][y]){ x=i; y=j; } } //找到的最大的数所在的列进行遍历,找出这一列最小的数 for(int k=0;k<n;k++){ if(a[k][y]<a[x][y]){ x=k; //这个break也可以不要,这个break意思是,只要x发生变化,说明这我们找的肯定不是鞍点 break; } } //判断得到的这个点的横坐标是否还为i,是的话这个点才为鞍点 if(x==i){ ret=1; break; } } if(ret){ printf("%d %d",x,y); } else{ printf("NONE"); } return 0; } */ //方法二,这种方法事实上比方法一更好,只是思维定式让我们习惯用方法一 #include<stdio.h> int main(){ int n; scanf("%d",&n); //定义矩阵 int a[n][n]; //找"鞍点"使用的坐标 int x=0,y=0; //输入矩阵具体的值 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } //ret用来判断是否存在鞍点,是否输出'NONE' int ret=0; //max和min分别表示是否为行最大和列最小 int max=1,min=1; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //重置max和min,这步不能漏 max=min=1; //判断是否为行最大 for(int k=0;k<n;k++){ if(a[i][k]>a[i][j]){ max=0; } } //判断是否为列最小 for(int k=0;k<n;k++){ if(a[k][j]<a[i][j]){ min=0; } } if(max==1&&min==1){ printf("%d %d",i,j); ret=1; } } } if(ret==0){ printf("NONE"); } return 0; }