方阵中的鞍点判断(数组) C语言

描述:

  输入一个正整数m(1<= m <= 6)和m阶方阵A中的元素,如果找到A中的鞍点(鞍点的元素值在该行上最大,在该列上最小),就输出它的下标;否则,输出"NONE"(没有鞍点),设A中最多有一个鞍点。

输入

3

1 2 3

0 1 2

0 0 1

输出

2 2

样例输入

4

1 2 3 4

0 1 1 3

0 0 1 2

1 0 0 1

样例输出

NONE

思路及分析:

        用二维数组来做这道题会减小我们的难度。同时,先求出每一行的最大值,再在这一个元素的这一列来判断它是不是最小的,对它们进行判断。最后打印出这个元素的下标就可以了。同时还要注意,在样例中输入4和矩阵里的元素时发现,有重复的值(1)的时候,就算他是最小的,但因为重复,不符合鞍点的定义,所以,还需要判断是否有重复的值。另外,题目说明,鞍点最多只有一个。要注意的是,有的和它相似的题目如PTA上面的求鞍点的题目没有说明当这一行有重复的值的情况。所以,先提交带有判断重复值的代码,如果有答案错误,就注释掉重复值判断的代码。版本2对版本1进行了优化。

//版本1
#include<stdio.h>

int main(void)
{
	int i = 0, j = 0;
	int n = 0;
	int arr[6][6] = { 0 };
	//最大值最小值 
	int max = 0;
	int min = 0;
	//记录列和行 
	int row = 0;
	int col = 0;
	//标签作用,当_bool为1的时候,输出坐标,否则输出NONE; 
	int _bool = 1;
	scanf("%d", &n);	
	
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	
	for(i = 0; i < n; i++)
	{
		//假设最大值为每一行的第一个元素 
		max = arr[i][0];
		
		//找这一行的最大值 
		for(j = 0; j < n; j++)
		{
			if(arr[i][j] > max)
			{
				//如果找到,就记录最大值,同时更新他的下标 
				max = arr[i][j];
				col = j;//行 
			}
		}
		
		//鞍点是这一行的最大值,也是这一列的最小值
		//让他成为最小值来进行后面的判断. 
		min = arr[i][col];
		
		for(j = 0; j < n; j++)
		{
			//判断最小值,除去了他本身. 
			if(arr[j][col] < min)
			{
				//更新最小值的值和下标 
				min = arr[j][col];
				row = j;
				_bool = 0;
			}

		}
		
		//最大值和最小值是否相等,是的话,要判断是否有重复的值 
		if(max == min)
		{
			_bool = 1;
			//这一行判断重复的值 
			for(j = 0; j < n; j++)
			{
				if(arr[i][j] == arr[i][col] && j != col)
				{
					//有重复的值,就让标签成为0; 
					_bool = 0;
				}
			}
			break;
		}
		else
		{
			_bool = 0;
		}
	}
	
	//若为1,打印,否则,不打印 
	if(_bool == 1)
	{
		printf("%d %d", row, col);
	}
	else
	{
		printf("NONE");
	} 
	
	return 0;
}

        

//版本2
#include <stdio.h>
 
int main()
{
	int n = 0;
	scanf("%d",&n);
	int arr[6][6] = { 0 }, i = 0, j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	// 题目保证给出的矩阵最多存在一个鞍点
	int max = 0, row = 0, col = 0,_bool = 0;
	
	for (i = 0; i < n; i++)
	{
		//记录 
		_bool = 1;
		//假设每一行最大值为第一个元素 
		max = arr[i][0];
		//列为0 
		col = 0;
		for (j = 0;j < n;j++)
		{
			if (arr[i][j] >= max)
			{
				max = arr[i][j];
				col = j;
				row = i;
			}
		}
		
            //判断一行是否有重复的值
			for(j = 0; j < n; j++)
			{
				if(arr[i][j] == arr[i][col] && j != col)
				{
					//有重复的值,就让标签成为0; 
					_bool = 0;
				}
			}
		
		//同列比较
		for (j=0;j<n;j++)
		{
			//鞍点的定义是一行最大,一列最小
            //所以直接让他和这一列比较。省去了找最小值,更新最小值的下标 
			//如果他比这一列的某个值大,说明不是; 
			if (max > arr[j][col])
			{
				_bool = 0;
				break;
			}
		}
				
		if (_bool == 1)
		{
			printf("%d %d",i,col);
			break;
		} 
	} 
	
	if (!_bool)
	{
		printf("NONE");
	}
	
	return 0;
}

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值