正面的能看到的也就是每一列最高的,左边能看到每一行最高的,上面则是看到全部但是答案只计算1(也就是枚举每个元素是否大于0),对每行每列的计算一个max然后累加答案即可
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[105][105];
int h[105];
int l[105];
int main() {
cin>>n>>m;
int ans1=0,ans2=0,ans3=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
l[j]=max(l[j],a[i][j]);
h[i]=max(h[i],a[i][j]);
ans3+=(a[i][j]>0);
}
}
for(int i=1;i<=m;i++){
ans1+=l[i];
}
for(int i=1;i<=n;i++){
ans2+=h[i];
}
cout<<ans1<<' '<<ans2<<' '<<ans3;
return 0;
}
n, m = map(int, input().split())
a = [[0] * 105 for _ in range(105)]
h = [0] * 105
l = [0] * 105
ans1, ans2, ans3 = 0, 0, 0
for i in range(1, n + 1):
row = list(map(int, input().split())) # 每行读取 m 个数
for j in range(1, m + 1):
a[i][j] = row[j-1]
l[j] = max(l[j], a[i][j])
h[i] = max(h[i], a[i][j])
if a[i][j] > 0:
ans3 += 1
ans1 = sum(l[1:m + 1])
ans2 = sum(h[1:n + 1])
print(ans1, ans2, ans3)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] a = new int[105][105];
int[] h = new int[105];
int[] l = new int[105];
int ans1 = 0, ans2 = 0, ans3 = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
a[i][j] = sc.nextInt();
l[j] = Math.max(l[j], a[i][j]);
h[i] = Math.max(h[i], a[i][j]);
if (a[i][j] > 0) {
ans3++;
}
}
}
for (int i = 1; i <= m; i++) {
ans1 += l[i];
}
for (int i = 1; i <= n; i++) {
ans2 += h[i];
}
System.out.println(ans1 + " " + ans2 + " " + ans3);
}
}
“学霸题,数正方体,头顶标数法,三层标上3,二层标上2,一层标上1,全部加起来,你学会了吗”
给定一个矩阵,矩阵中的每个数字表示这个位置上叠放的小正方体数量。
小正方体边长为1。
请问:题目所描述的几何体的三视图(从正面、左面和上方看的投影)各自的面积为多少?
一行两个整数n,m表示矩阵的行数和列数
之后n行每行m个整数ai,j,表示该位留上叠放了ai,j个小正方体。
1≤n,m≤100
0≤ai,j≤100
一行三个整数,依次代表从正面,左面和上方看过去的投影的面积。
输入
2 3
3 3 2
3 2 1
输出
8 6 6
说明
样例1如图所示

从正面看:3×3的面,仅右上角有一个缺口,面积为3×3−1=8
从左面看:3×2的面,面积6
从上面看:2×3的面,面积6
输入
2 2
1 0
2 3
输出
5 4 3
说明