小凡有一张边长为2的正方形白纸,上面画了2×2个边长为1的格子,每个格子上可以放置棱长为1的立方体。小凡手中有若干个棱长为1的立方体,他随机地在每个格子上放置一些立方体,求由这些立方体组成的几何体的表面积。
输入格式:
输入两行,每行两个不超过100的正整数,代表从俯视的角度看,白纸所画每个格子上立方体的数量。
输出格式:
输出一行,包含一个整数,表示几何体的表面积。
输入样例:
上图对应的输入数据如下:
2 1
1 1
输出样例:
20
代码如下:
#include<iostream>
using namespace std;
int main() {
int a[5];
cin>>a[1]>>a[2]>>a[3]>>a[4];
int sum = 0;
sum = (a[1]+a[2]+a[3]+a[4])*6 - 8;//由于是正整数,故底层至少有4正方形,每相邻一个减少两个面,4个两两相邻,故减少8个面,故减去8
for (int i = 1; i < 5; i++) {
if (a[i] > 1) sum -= 2*(a[i]-1);
}//每增加一层,都要与底层面接触,故减少2个面
int max = (a[1]>a[2])?a[1]:a[2];//如果输入4 3 1 2,则顶层不相等,但中间层有相等的,故要通过循环来判断
int min = (a[1]<a[2])?a[1]:a[2];
for (;max > 1; max--) {
if (max == min) {
sum -= 2 * (max - 1);
}
}//第一行两个正方形相邻的情况
max = (a[1]>a[3])?a[1]:a[3];
min = (a[1]<a[3])?a[1]:a[3];
for (;max > 1;max--) {
if (max == min) sum -= 2 * (max - 1);
}//第一列两个正方形相邻的情况
max = (a[3]>a[4])?a[3]:a[4];
min = (a[3]<a[4])?a[3]:a[4];
for (;max > 1;max--) {
if (max == min) sum -= 2 * (max - 1);
}//第二行两个正方形相邻的情况
max = (a[2]>a[4])?a[2]:a[4];
min = (a[2]<a[4])?a[2]:a[4];
for (;max > 1;max--) {
if (max == min) sum -= 2 * (max - 1);
}//第二列两个正方形相邻的情况
cout<<sum;
}
min) sum -= 2 * (max - 1);
}//第二列两个正方形相邻的情况
cout<<sum;
}