360笔试分享-2019.8.15,C++软件开发笔试第一题
将长N*M厘米的矩形区域划分成N行M列(每行每列的宽度均为1厘米),在第一行地j列的位置上叠放Ai,j个边长为1厘米的正方体(1<=Ai,j<=100),所有正方体就组成了一个立体图形,每个正方体六个面中的一部分被其他正方体遮挡,未被遮挡部分的总面积即为该立体图形的表面积,那么该立体图形的表面积是多少厘米?
样例解释:
输入:第一行包含两个整数N和M,1<=N,M<=1000;
接下来N行,每行包含M个整数,第i行的第j个整数表示Ai,j
输出:输出表面积的大小
样例
2 2
2 1
1 1
输出
20
思路暴力解法:
先记录总的方格个数,其次再计算被遮挡的面有多少,每一层,如果相邻,则遮挡面lost+1,
计算完一层就将当层所有的值全部减1.
当第二层时,除计算相邻遮挡面外,还计算此格子与下面一层的遮挡,只要存在上层格子则必然存在遮挡,lost++
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int rownum, colnum;
while (cin >> rownum >> colnum)
{
if ((rownum<1 || rownum>1000) || (colnum<1 || colnum>1000))
cout << -1 << endl;
int sum = 0;
vector<vector<int>> input;
int max = 0;
for (int i = 0; i < rownum; i++)
{
vector<int> tmp(colnum);
for (int j = 0; j < colnum; j++)
{
int value;
cin >> value;
tmp[j] = value;
sum+=value;
if (max < value)
max = value;
}
input.push_back(tmp);
tmp.clear();
}
int lost = 0;
for (int i = 0; i < max; i++)
{
for (int j = 0; j < rownum; j++)
{
for (int k = 0; k < colnum; k++)
{
if (i >= 1 && input[j][k] > 0)//当格子有多层时,有值便lost++
lost++;
if (k >= 1 && (input[j][k] > 0 && input[j][k - 1] > 0))//列上相邻的面遮挡
{
lost++;
}
if (j >= 1)
{
if (input[j][k] > 0 && input[j - 1][k] > 0)//行上相邻的面遮挡
{
lost++;
}
}
}
}
for (int j = 0; j < rownum; j++)//计算完以后,将当层所有的格子数量减1
{
for (int k = 0; k < colnum; k++)
{
input[j][k]--;
}
}
}
cout << sum * 6 - lost * 2 << endl;
}
}
查看15道真题和解析