1257: 【基础】马鞍数
题目描述
求一个n×m数阵中的马鞍数,输出它的位置。所谓马鞍数,是指在行上最小而在列上最大的数。
如下: n=5 m=5
5 6 7 8 9
4 5 6 7 8
3 4 5 2 1
2 3 4 9 0
1 2 5 4 8
则1行1列上的数就是马鞍数。
输入
共n+1行,第一行: n m (n,m<10)
第2到n+1行:每行m个整数
输出
输出若干行:如果存在马鞍数,则输出所有马鞍数,每行一个,为行和列以及马鞍数,马鞍数按照读入的顺序输出,也就是说,如果有多组马鞍数,先读入的先输出。
如果不存在马鞍数,则输出'not exist'。
样例输入
9 8
9 8 7 6 5 4 3 2
8 8 9 9 9 9 9 9
3 7 7 6 5 4 2 1
8 8 3 2 1 7 3 2
7 5 3 2 9 1 3 2
6 3 2 1 9 3 1 3
8 2 1 3 5 8 9 1
1 3 2 1 3 5 6 8
9 3 1 2 3 4 5 8
样例输出
2 2 8
使用万能头文件和预编译宏的简化代码
#include <bits/stdc++.h>
#define N 100
#define M 100
using namespace std;int main() {int n, m;int mat[N][M], row_min[N], col_max[M];// 输入矩阵cin >> n >> m;for(int i=0; i<n; i++)for(int j=0; j<m; j++)cin >> mat[i][j];// 计算每行最小值for(int i=0; i<n; i++) {row_min[i] = INT_MAX;for(int j=0; j<m; j++)if(mat[i][j] < row_min[i])row_min[i] = mat[i][j];}// 计算每列最大值for(int j=0; j<m; j++) {col_max[j] = INT_MIN;for(int i=0; i<n; i++)if(mat[i][j] > col_max[j])col_max[j] = mat[i][j];}// 查找马鞍数bool found = false;for(int i=0; i<n; i++)for(int j=0; j<m; j++)if(mat[i][j] == row_min[i] && mat[i][j] == col_max[j]) {cout << i+1 << " " << j+1 << " " << mat[i][j] << endl;found = true;}if(!found) cout << "not exist" << endl;return 0;
}
优化说明:
-
全局数组定义:
-
使用全局数组
a[sz][sz]
存储矩阵 -
rmin
和cmax
也定义为全局数组
-
-
变量简化:
-
矩阵命名为
a
(简洁) -
行最小值数组命名为
rmin
(row min) -
列最大值数组命名为
cmax
(column max)
-
-
算法优化:
-
使用
min()
和max()
函数简化极值计算 -
保持O(n×m)的时间复杂度
-
-
输出格式:
-
行号列号从1开始输出
-
使用布尔标记
exist
判断是否存在解
-
注意事项:
-
全局数组自动初始化为0
-
sz
定义为100满足题目n,m<10的要求 -
使用万能头文件
<bits/stdc++.h>
包含所有必要库
这个版本在保持算法效率的同时,代码更加简洁清晰,完全符合题目要求的约束条件。