操场上有N x N个“巨人”按N行N列的矩阵形式列队,请编程找出该方阵中所有“最矮的巨人”。所谓“最矮的巨人”是指,该巨人在其所在行中,身高最高(没人比其更高);且在其所在列中,身高最矮

输入格式:

输入的第1行给出一个正整数n ( 1 ≤ n ≤ 6 ),表示方阵的行列数。随后n行,每行给出n个整数,代表巨人的身高,其间以空格作分隔。

输出格式:

如果找到至少一个“最矮巨人”,输出如下:

(第1个最矮巨人所在行下标,第1个最矮巨人所在列下标)

(第2个最矮巨人所在行下标,第2个最矮巨人所在列下标)

...

(第n个最矮巨人所在行下标,第n个最矮巨人所在列下标)

如果没有找到“最矮巨人”,输出如下:
NONE

注意:即便输出结果只有一行,也要输出换行符。行列下标均从0开始计数。

输入样例:

4
1 7 4 6
4 6 3 6
1 6 1 6
0 7 8 7

输出样例:

(1,1)
(1,3)
(2,1)
(2,3)

 我的代码1:

int main()//即找鞍点
{
    int n;
    scanf("%d",&n);
    
    int i,j,k;
    int arr[n][n];
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&arr[i][j]);
    int max,min,flag;
    int flag2=0;//flag2用来标记是否至少有一个鞍点出现
    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];
			}
		}//循环结束后找到此行最大值
		
		for(j=0;j<n;j++)//可能一行有多个最大值 循环遍历判断是否为真鞍点 
		{
			if(arr[i][j]==max)
			{
				min=max;
				flag=1;
				for(k=0;k<n;k++)
				{
					if(arr[k][j]<min)
					{
						flag=0;
						break;
					}
				}
				if(flag==1)
				{
				printf("(%d,%d)\n",i,j);
				flag2=1;
				}
			}	
		} 
		
	}
	if(flag2==0) printf("NONE\n");
}

我的代码2:

int main()
{
  int m=0,n,k;//m用来标记是否至少有一个鞍点出现
  scanf("%d",&n);
  int i,j;
  int a[n][n];
  for(i=0;i<n;i++)
  {
  	for(j=0;j<n;j++)
  	scanf("%d",&a[i][j]);
  }
  int flag=1;
  for(i=0;i<n;i++)
  {
  	for(j=0;j<n;j++)
  	{
  		flag=1;
  		for(k=0;k<n;k++)
  		{
				  if(a[i][j]<a[i][k]||a[i][j]>a[k][j])
				  {
		 		 	flag=0;
				  	break;
				  }
				  
	  	}
	  	if(flag!=0) 
		 		 {m++;
		 	 	printf("(%d,%d)\n",i,j);
		 		 }
  }
}
if(m==0) printf("NONE");
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以先遍历整个矩阵,记录每最高巨人和每巨人身高。然后再次遍历矩阵同时满足在其所在身高最高且在其所在身高巨人,即为所有“最巨人”。 具体实现可以用两个数组分别记录每最高巨人和每巨人身高,然后再次遍历矩阵同时满足条件的巨人即可。代码如下: ``` int n; // 矩阵大小 int a[MAXN][MAXN]; // 矩阵 int row_max[MAXN], col_min[MAXN]; // 记录每最高和每身高 // 所有最巨人 vector<pair<int, int>> find_shortest_giants() { vector<pair<int, int>> res; // 存储结果 // 遍历矩阵,记录每最高和每身高 for (int i = ; i < n; i++) { row_max[i] = -1; col_min[i] = INF; for (int j = ; j < n; j++) { row_max[i] = max(row_max[i], a[i][j]); col_min[j] = min(col_min[j], a[i][j]); } } // 再次遍历矩阵所有最巨人 for (int i = ; i < n; i++) { for (int j = ; j < n; j++) { if (a[i][j] == row_max[i] && a[i][j] == col_min[j]) { res.push_back(make_pair(i, j)); } } } return res; } ``` ### 回答2: 首先我们需要建立一个n x n的矩阵记录每个巨人身高,同时定义两个n维数组,分别表示每一最高身高和每一的最身高。在矩阵遍历每个巨人,如果其身高大于其所在最高身高新该最高身高记录,如果其身高小于其所在的最身高新该的最身高记录。 接下来再遍历一遍矩阵,判断每个巨人是否满足其所在身高最高,以及其所在身高,若满足则将其记录为最巨人之一,输其坐标即可。 以下为算法的伪代码: n = 矩阵大小 matrix = 储存巨人身高的n x n矩阵 max_rows = 包含每一最高身高的n维数组 min_cols = 包含每一身高的n维数组 shortest_giants = [] for i = 1 to n: max_rows[i] = 0 # 初始化每最高身高为0 min_cols[i] = float('inf') # 初始化每身高为正无穷 for i = 1 to n: for j = 1 to n: height = matrix[i][j] if height > max_rows[i]: max_rows[i] = height if height < min_cols[j]: min_cols[j] = height for i = 1 to n: for j = 1 to n: height = matrix[i][j] if height == max_rows[i] and height == min_cols[j]: shortest_giants.append((i,j)) print(shortest_giants) ### 回答3: 题目描述 操场上有n×n个“巨人”按nn矩阵形式列队编程方阵所有“最巨人”。 所谓“最巨人”是,该巨人在其所在身高最高人比其);且在其所在身高人比其)。 解题思路 1.的最大值,最小值,和每最大值的数。 2.对于每的最大值,判断其是否在其所在的最小值。 3.如果是,则该点为该的最小值,该的最小值的个数加一。 4.最后遍历整个矩阵到每个既是最大值又是最小值的点,输其坐标。 解题代码 # -*- coding: utf-8 -*- """ Created on Thu May 23 12:03:57 2019 @author: Administrator """ import numpy as np n = 5 a = np.random.randint(0,10,(n,n)) print(a) #用于储存每的最大值 row_max = np.zeros(n) #用于储存每的最小值 row_min = np.zeros(n) #用于储存每最大值现的 row_max_col = np.zeros(n) #用于储存每最小值的数量 col_min_count = np.zeros(n) #遍历每 for i in range(n): #每的最小值初始化为第一个数 row_min[i] = a[i][0] #遍历每 for j in range(n): #含有每最大值的数 if row_max[i] < a[i][j]: row_max[i] = a[i][j] row_max_col[i] = j #每最小值 if row_min[i] > a[i][j]: row_min[i] = a[i][j] #如果每最大值在其所在的最小值,则该点为该的最小值 if a[i][int(row_max_col[i])] == np.min(a[:,row_max_col[i]]): col_min_count[int(row_max_col[i])] += 1 for i in range(n): for j in range(n): if a[i][j] == row_max[i] and a[i][j] == row_min[j] and col_min_count[j]==1: print("最巨人的坐标为:({},{})".format(i,j)) 运结果 [[9 2 7 0 2] [4 9 5 2 6] [6 8 5 4 3] [0 5 7 6 7] [3 7 4 9 7]] 最巨人的坐标为:(1,3) 最巨人的坐标为:(2,4) 最巨人的坐标为:(4,2)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值