关于PTA 7-56 找鞍点的代码实现及测试分析

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

输入第一行给出一个正整数n1)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

编码思路1:1.找出每一行的最大值及其下标;2.找出下标对应列的最小值;3.检查行号是否相等。

编码思路2:1.循环检查每一个元素是否是该行最大值和该列最小值。

测试分析:采用思路1设计的代码有一个死角即当某一行的最大值不止1个时,靠后的最大值会被忽视而只采用第一个最大值检验,

或者某一列的最小值不止1个时,靠后的最小值会被被忽略,造成遗漏。

#include<stdio.h>

int main()
{
//  int n=0;
//  scanf("%d",&n);
//  int a[n][n];
//  for(int i=0;i<n;i++)
//  {
//    for(int j=0;j<n;j++)
//    {
//      scanf("%d",&a[i][j]);
//    }
//  }
  int n=4;
  int a[4][4]={{1,6,4,9},{4,8,3,6},{1,6,1,2},{0,7,8,9}};
  int flag=0,maxf=1,minf=1;//设置鞍点标记,行最大值标记,列最小值标记
  for(int i=0;i<n;i++)
  {
  	for(int j=0;j<n;j++)
  	{
  		maxf=minf=1;//检验a[i][j]是否符合鞍点要求
  		for(int k=0;k<n;k++)
  		{
  			if(a[i][j]<a[i][k])
  			{
  				maxf=0;
  				break;
			}
			else if(a[i][j]>a[k][j])
			{
				minf=0;
				break;
			}
		}
		if(maxf==1&&minf==1)
		{
			flag=1;
			printf("%d %d",i,j);
			break;
		}
	}
	if(flag==1)
	{
		break;
	}
  }
  if(flag==0)
  {
    printf("NONE");
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/bawangtu/article/details/81030254
今日推荐