• 查找鞍点


    ------------恢复内容开始------------

    题目
    对于给定的整数矩阵A[5,5],设计算法查找出所有的鞍点。
    提示:鞍点的特点:列上最小,行上最大。

    输入格式:

    输入5行5列整数,同行数据间以空格为间隔。

    输出格式:

    在一行中以以下格式输出矩阵中的所有鞍点,每个鞍点的显示格式为:
    [<鞍点的行坐标>,<鞍点的列坐标>,<鞍点的值>]

    输入样例:

    11 3 5 6 9

    12 4 7 8 10

    10 5 6 9 11

    8 6 4 7 8

    15 10 11 20 25

    输出样例:

    [3,0,8][3,4,8]

    ---------------------------------------一条华丽的分割线---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    这个PTA上的题是真的难到我了,冥思苦想了老半天,要细分的情况太多了,导致脑袋有点转不过弯来,

    贴一波代码

    #include <stdio.h> 
    int main()
    {
     int  i, j, s, t, flag;
     int a[5][5] = { 0 }, max[5], min[5], max1[5] = { 0 };
     for (i = 0; i < 5; i++)
     {
      for (j = 0; j < 5; j++)
       scanf("%d", &a[i][j]);/*输入第i行第j列的元素*/
     }
     for (i = 0; i < 5; i++)
     {
      s = 0;
      for (j = 1; j < 5; j++)
      {
       if (a[i][s] < a[i][j]) s = j;
      }
      max[i] = s;/*找出第i行的最大数,将其下标存入max[i]*/
      for (j = s+1; j < 5; j++)//从s+1列开始比较,因为s列前面的肯定都小于第s列
      {
    if (a[i][s] == a[i][j])  max1[i]= j;
      }/*在同一行中可能出现相同的最大值,那么再增加一个数组来保存那另外一个相同数值的下标,其余的置零。没必要考虑每一列
    中相等的数字,因为如果恰好有列中相等的最小值是其相应列中的最大值,已经在考虑每行时将其的列下标保存进了max[]数组
    */
     }
     for (j = 0; j < 5; j++)
     {
      t = 0;
      for (i = 1; i < 5; i++)
      {
       if (a[t][j] > a[i][j]) t = i;
      }
      min[j] = t;/*找出第j列的最小数,将其下标存入min[i]*/
      
     }
     
     for (i = 0; i < 5; i++)
     {
      j = max[i];
      if (min[j] == i)
      {
       flag = 1;
       s = i;
       t = j;
       
      }
      else flag = 0;
      if (flag == 1) printf("[%d,%d,%d]", s, t, a[s][t]);//首先输出前一个鞍点
      
     }
     for (i = 0; i < 5; i++)//如果一行中有相等的最大值,则输出第二个最大值的鞍点
     {
      j = max1[i];
      if (j!=0&&min[j] == i)//第二个鞍点的列坐标不可能为0,
      {
       flag = 1;
       s = i;
       t = j;
      }
      else flag = 0;
      if (flag == 1) printf("[%d,%d,%d]", s, t, a[s][t]);
     }
     return 0;
    }
    --------------------------------------------更新一波,不用数组保存最大值下标的思路,直接找出最大值然后在同一列比较,如果是最小值才输出,从老易那弄来的,更好理解----
    #include<stdio.h>
    int main()
    {
        int i,j,k,a[5][5],r,c,Max,flag;
        for(i=0; i<5; i++)
            for(j=0; j<5; j++)
                scanf("%d",&a[i][j]);
        for(i=0; i<5; i++)
        {
            for(Max=a[i][0],j=1,r=i,c=0; j<5; j++)              //j循环找行最大值
            {
                if(a[i][j]>Max)
                {
                    Max=a[i][j];
                    c=j;
                }
            }
           
            for(k=0,flag=1; k<5; k++)
                if(a[k][c]<Max)
                    flag=0;
            if(flag)
                printf("[%d,%d,%d]",r,c,Max);
            for(j=c+1; j<5; j++)
            {
                if(a[r][j]==Max)
                {
                    c=j;
                    for(k=0,flag=1; k<5; k++)
                        if(a[k][c]<Max)
                            flag=0;
                    if(flag)
                        printf("[%d,%d,%d]",r,c,Max);
                }
            }
        }

        return 0;
    }

    ------------恢复内容结束------------

  • 相关阅读:
    Android——ListView学习笔记(一)
    记录笔记——关于request.getRequestDispatcher().forward(request, response)的跳转问题
    Python + openCV 实现图像垂直投影和水平投影
    2020年-第三周助教总结-第二组
    Python记录——字符串的常用方法
    2020年-第二周助教总结-第二组
    Android开发——三种活动跳转方式
    2020年-第一周助教总结-第二组
    Python —— 实例化ndarray对象
    海信聚好看矫恒浩:构建异地双活混合云,利用公共云应对流量突增
  • 原文地址:https://www.cnblogs.com/ArnoldSchwarzenegger/p/11865125.html
Copyright © 2020-2023  润新知