------------恢复内容开始------------
题目
对于给定的整数矩阵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;
}/*在同一行中可能出现相同的最大值,那么再增加一个数组来保存那另外一个相同数值的下标,其余的置零。没必要考虑每一列
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;
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;
else flag = 0;
if (flag == 1) printf("[%d,%d,%d]", s, t, a[s][t]);
}
return 0;
}
}
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;
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);
}
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;
}
------------恢复内容结束------------