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

#360公司##笔试题目##秋招##C++工程师#
全部评论

相关推荐

冰皮月饼_FLORRIEEE:你是准备投产品嘛?可以重新整理一下实习的bulletpoint,侧重描述你的工作所带来的结果收益,不要只写泛泛的内容(比如改写通过xx数据分析,提升xx),产品的价值并不在处理和分析数据的过程
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客企业服务