java 查找鞍点_查找鞍点 - ArnoldSchwarzenegger - 博客园

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

题目

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

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

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]

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]

flag=0;

if(flag)

printf("[%d,%d,%d]",r,c,Max);

}

}

}

return 0;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值