NC207451. 地理学带师
描述
小昌最近研究起了地理知识。他认为在一张图中,那些顶峰点和低谷点是最有研究价值的地方,一张图的顶峰点和低谷点往往也能反映出一块区域的地貌特性。
我们不妨将一张图抽象成一个的二维矩阵(n代表行数,m代表列数).这个矩阵上的每个点有一个值.代表着它的地势高度。以 上北 下南 左西 右东 定义这张图的方向.
现在我们定义这个二维矩阵中的顶峰点和低谷点:(注意,不用考虑矩阵之外的点)
顶峰点: 站在这个点上往东西南北四个方向看去,其他所有点的地势均严格低于该点的点。
低谷点:站在这个点上往东西南北四个方向看去,其他所有点的地势均严格高于该点的点.
往北看去地势高度依次是:1,3
往南看去地势高度依次是:4,1
往西看去地势高度依次是:3,4
往东看去地势高度依次是:1,2
现在给你这个二维矩阵,小昌想问你,这张图里有多少个顶峰点,多少个低谷点?
输入描述
第一行为两个整数n , m 代表着这个矩阵的行数和列数 ()
接下来n行,每行m个整数. 第i行第j个数 对应的表示这个矩阵第i 行 第 j 列的点的地势. ()
输出描述
输出两行整数,第一行整数代表这个二维矩阵中顶峰点的个数,
第二行整数代表这个二维矩阵中低谷点的个数.
示例1
输入:
3 3 1 3 4 3 5 3 7 4 4
输出:
2 1
说明:
解释:(注意,二元组的第一维代表行号,第二维代表列号)
顶峰点有两个: 分别位于位置(2 , 2) , 位置(3 , 1)
低谷点有一个:位于位置(1,1).
C++14(g++5.4) 解法, 执行用时: 12ms, 内存消耗: 432K, 提交时间: 2020-06-14 16:45:20
#include<iostream> #include<stdio.h> using namespace std; int max1=0,min1=0; int n,m; int map[105][105]; int find(int a,int b,int n,int m) { int pow1=0,pow2=0; for(int i=0;i<m;i++) { if(i!=b){ if(map[a][b]>map[a][i]) pow1++; else if(map[a][b]<map[a][i]) pow2++; } } for(int j=0;j<n;j++) { if(j!=a){ if(map[a][b]>map[j][b]) pow1++; else if(map[a][b]<map[j][b]) pow2++; } } if(pow1==n+m-2) max1++; if(pow2==n+m-2) min1++; } int main() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>map[i][j]; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) find(i,j,n,m); cout<<max1<<endl; cout<<min1<<endl; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 500K, 提交时间: 2020-06-14 14:52:34
#include<bits/stdc++.h> using namespace std; int a[101][105]; int main(){ int n,m,ans1=0,ans2=0; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) cin>>a[i][j]; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int t1=0,t2=0,t3=0,t4=0; for(int k=1;k<=n;k++){ if(a[i][j]>a[k][j]) t1++; if(a[i][j]<a[k][j]) t3++; } for(int k=1;k<=m;k++){ if(a[i][j]>a[i][k]) t2++; if(a[i][j]<a[i][k]) t4++; } if(t1==n-1&&t2==m-1){ ans1++; } if(t3==n-1&&t4==m-1){ ans2++; } } } cout<<ans1<<endl; cout<<ans2<<endl; return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 173ms, 内存消耗: 26316K, 提交时间: 2020-06-14 16:02:31
n, m = map(int, input().split()) a = [[int(j) for j in input().split()] for i in range(n)] x = 0 y = 0 for i in range(n): for j in range(m): if all(x < a[i][j] for x in (a[i][0:j] + a[i][j + 1:m])) and all(x < a[i][j] for x in (b[j] for b in a[0:i])) and all(x < a[i][j] for x in (b[j] for b in a[i + 1:n])): x += 1 if all(x > a[i][j] for x in (a[i][0:j] + a[i][j + 1:m])) and all(x > a[i][j] for x in (b[j] for b in a[0:i])) and all(x > a[i][j] for x in (b[j] for b in a[i + 1:n])): y += 1 print(x) print(y)