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

题目
对于给定的整数矩阵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;
}

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

Posted on 2019-11-15 11:08  ArnoldSchwarzenegger  阅读(457)  评论(0编辑  收藏  举报