【查找二维数组 每行最大的数 每列最大的数】
文章图片
样例:输入
2 2
2 1
1 1
输出
20
思路:
因为未被遮挡的面子是该立方体的最小面积,
将这些立方体堆叠看作一个二维数组。
其实就是查找从前往后看每列最大值相加,从左往右看每行最大值相加,从上往下看占了多少位置。
表面积 = (每列最大值的和 + 每行最大值的和 + 二维数组一共多少位置)*2
1.返回一个二维数组每行最大的值
一个 n行 m列的二维数组ar.
public static int[] rowMax(int[][] ar,int n, int m){// 接收每行中最大的数
int[] rowmax = new int[n];
for(int i = 0;
i < n;
i++){
rowmax[i] = ar[i][0];
for(int j = 0;
j < m;
j++){
if(ar[i][j] > rowmax[i]){
rowmax[i] = ar[i][j];
}
}
}
return rowmax;
}
2.返回一个二维数组每列最大的值
public static int[] linMax(int[][] ar,int n, int m){// 接收每列中最大的数
int[] linmax = new int[m];
for(int j = 0;
j < m;
j++){
linmax[j] = ar[0][j];
for(int i = 0;
i < n;
i++){
if(ar[i][j] > linmax[j]){
linmax[j] = ar[i][j];
}
}
}
return linmax;
}
3.输出表面积
import java.util.Scanner;
public class area{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] arr = new int[n][m];
for(int i = 0;
i < n;
i++){
for(int j = 0;
j < m;
j++){
arr[i][j] = sc.nextInt();
}
}int[] r =new int[n];
int[] l =new int[m];
r = rowMax(arr,n,m);
// 接收每行中最大的数
l = linMax(arr,n,m);
//接收每列最大的数
int q = n*m;
//接收上表面的面积int biao =(arrSum(r)+arrSum(l)+q)*2;
System.out.println(biao);
}
public static int arrSum(int [] m){
int sum = 0;
for(int i = 0;
i < m.length;
i++){
sum += m[i];
}
return sum;
}