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; } }