找鞍点

没想到吧,又是学校的作业qwq
找鞍点
【题目描述】
输入一个m行n列的整型数组(m,n从键盘输入,m,n均大于0小于20),求出这个数组的“鞍点”。鞍点是指这个元素在所处的行上最大,列上最小。请输出这个鞍点的位置及鞍点的值(鞍点有可能有多个,多个鞍点,输出时每个鞍点的信息独立成行)。如果没有鞍点,请输出No.

其实自己凭感觉的话直接最佳解就出来了,但是当时一是没列步骤,写算法流程,二是自己懒得动手就直接在网上“借鉴”了一部分,经过简单修改如下

#include<stdio.h>
#define M 20
#define N 20
int main()
{
    int a[M][N];
    int i, j,m,n;
    int flag= 0, temp1[M], temp2[N];
    scanf("%d %d",&m,&n);
    for (i = 0; i<m; i++)
        for (j=0; j<n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    //处理数组,temp1为行,temp2为列
    for (i = 0;i < m;i++)
    {
        temp1[i] = a[i][0];
        temp2[i] = a[0][i];
        for (j = 0;j < n;j++)
        {
            if (temp1[i] < a[i][j])    temp1[i] = a[i][j];
            if (temp2[i] > a[j][i])    temp2[i] = a[j][i];
        }
    }
    for (i = 0;i < m;i++)
    {
        for (j = 0;j < n;j++)
        {
            if (a[i][j] == temp1[i] && a[i][j] == temp2[j])
                {
                    printf("(%d,%d)=>%d\n",i,j,a[i][j]);
                    flag++;
                }
        }
    }
    if(!flag)
        printf("No.");
}

在处理数据那个位置,因为考虑不周,会出现例如m=3,n=4。但列的值直接赋值给了a[4][3]超出数组的位置了,所以会产生错误。在通过检查后发现了这问题,将代码改成如下

#include<stdio.h>
#define M 20
#define N 20
int main()
{
    int a[M][N]= {0};
    int i, j,m,n;
    int flag= 0, temp1[M], temp2[N];
    scanf("%d %d",&m,&n);
    for (i = 0; i<m; i++)
        for (j=0; j<n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    //处理数组,temp1为行,temp2为列
    for (i = 0; i < m; i++)
    {
        temp1[i] = a[i][0];
        for (j = 0; j < n; j++)
            if (temp1[i] < a[i][j])
                temp1[i] = a[i][j];
    }
    for(i=0; i<n; i++)
    {

        temp2[i] = a[0][i];
        for(j=0; j<m; j++)
            if (temp2[i] > a[j][i])
                temp2[i] = a[j][i];
    }
for (i = 0; i < m; i++)
{
    for (j = 0; j < n; j++)
    {
        if (a[i][j] == temp1[i] && a[i][j] == temp2[j])
        {
            printf("(%d),(%d)=>%d\n",i,j,a[i][j]);
            flag++;
        }
    }
}
if(!flag)
    printf("No.");
}

总有一天,我也要成为大佬。加油!奥里给!!!!!!!

2019/12/27
整挺好,同学写的代码比我这个好,不用我那个数组做,确实需要学习


#include <stdio.h>
#define M 20
#define N 20
int main()
{
    int a[M][N],i,j,k,q,m,n,flag,FLAG,max;
    flag=1;
    FLAG=0;
    scanf("%d%d",&m,&n);
    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0; i<m; i++)/*从第一行开始遍历*/
    {
        max=a[i][0];
        for(j=0; j<n; j++)
        {
            if(max<a[i][j])
            {
                max=a[i][j];//如果哪里有比他大的就开始重新赋值
            }
        }
        for(q=0; q<n; q++)//在找的的这行开始横着来
        {
            if(a[i][q]==max)//如果有和最大值相等的值,就开始竖着来
            {
                for(k=0; k<m; k++)//开始竖着来
                {
                    if(a[k][q]<max)//如果有任何一个比他小,退出循环
                    {
                        flag=0;
                        break;
                    }
                }
                if(flag==1)
                {
                    printf("(%d,%d)=>%d",i,q,max);
                    printf("\n");
                    FLAG=1;
                }
            }
        }
    }
    if(FLAG==0)
        printf("No.");

    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值