
关于这道题,困住了我很久,我翻来覆去改了近2h才改正确。
那么话不多说,进入题目的解读。
有一个m*n的矩阵。
所以我们要定义 m,n这两个变量。
显然我们需要一个数组来读入这些变量。
由于我们注意到 m,n 都大于 一 小于10.但是为了有利于算法的实现,以及防止边界性问题,防止数组越界,这里我们要多定义几个数字来实现我们的目的。这样有效的提高了代码的健壮性。
而此时我们发现了要多组输入
所以使用 while(scanf("%d %d",&m,&n)!=EOF)
这里!=EOF 意思是不以文件结尾就一直输入。(End Of File)
显然的我们这里都不是文件,所以就可以实现多组输入
于是就完成了第一部分的内容
#include<stdio.h>
int main(){
int m,n;
int sz[15][15];
while(scanf("%d %d",&m,&n)!=EOF){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&sz[i][j]);
}
}
接下来我们要完成寻找行上的最大值同时也是列上的最小值的比较。
我们此时定义 max=1,min=1;
当我们在循环的过程中,首先我们完成列上的最小值的寻找,如果经历循环后min=1,那么sz[i][k]就是最小值,当我们发现sz[i][j]>sz[i][j]后,那么此时它就不是最小值了,所以我们就无需再进行循环了,此时就break,就好了。同理则是最大值。
当同时满足时,我们输出。
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int max=1,min=1;
for(int k=0;k<n;k++){
if(sz[i][k]>sz[i][j]){
min=0;
break;
}
}
for(int k=0;k<m;k++){
if(sz[k][j]<sz[i][j]){
max=0;
break;
}
}
if(max&&min){
printf("Array[%d][%d]=%d\\n",i,j,sz[i][j]);
flag1=1;
flag2=1;
break;
}
}
}
但是我们需要判断是否找到了鞍点,如果没有鞍点,就输出None.
于是我们就需要引入新的变量 flag1,flag2.
为什么需要两个变量呢
因为我要用flag1=1 表示我找到了鞍点, flag2=1表示输出过了结果
所以我们要在最开始的时候定义一个全局变量flag1=0,flag2=0;
当 flag1=1 时,则此时找到了鞍点,flag2=0时,则此时没有输出过结果,也就是意味着这个矩阵没有鞍点,所以我们输出None。
于是我此时给出完整的代码
#include<stdio.h>
int main(){
int m,n;
int sz[15][15];
int flag1=0,flag2=0;
while(scanf("%d %d",&m,&n)!=EOF){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&sz[i][j]);
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int max=1,min=1;
for(int k=0;k<n;k++){
if(sz[i][k]>sz[i][j]){
min=0;
break;
}
}
for(int k=0;k<m;k++){
if(sz[k][j]<sz[i][j]){
max=0;
break;
}
}
if(max&&min){
printf("Array[%d][%d]=%d\\n",i,j,sz[i][j]);
flag1=1;
flag2=1;
break;
}
}
}
if(flag1){
break;
}
if(!flag2){
printf("None\\n");
}
}
return 0;
}
那么此题到这里就结束了,感谢您的阅读!






