欢迎光临
我们一直在努力

c语言的练习-二维数组的练习-鞍点的寻找

关于这道题,困住了我很久,我翻来覆去改了近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;
}

那么此题到这里就结束了,感谢您的阅读!

赞(0)
未经允许不得转载:171主机测评 » c语言的练习-二维数组的练习-鞍点的寻找
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址