操场上有n x n个“巨人”按n行n列的矩阵形式列队,请编程找出该方阵中所有“最矮的巨人”。 所谓“最矮的巨人”是指,该巨人在其所在行中,身高最高(没人比其更高);且在其所在列中,身高最矮(没人比其更矮)。
时间: 2023-05-31 20:20:37 浏览: 355
3_9.rar_n堆石子_石子合并
### 回答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个“巨人”按n行n列的矩阵形式列队,请编程找出该方阵中所有“最矮的巨人”。 所谓“最矮的巨人”是指,该巨人在其所在行中,身高最高(没人比其更高);且在其所在列中,身高最矮(没人比其更矮)。
解题思路
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)
阅读全文