1. 程式人生 > >【Leetcode】883. 三維形體投影面積

【Leetcode】883. 三維形體投影面積

題目描述:

在 N * N 的網格中,我們放置了一些與 x,y,z 三軸對齊的 1 * 1 * 1 立方體。

每個值 v = grid[i][j] 表示 v 個正方體疊放在單元格 (i, j) 上。

現在,我們檢視這些立方體在 xy、yz 和 zx 平面上的投影

投影就像影子,將三維形體對映到一個二維平面上。

在這裡,從頂部、前面和側面看立方體時,我們會看到“影子”。

返回所有三個投影的總面積。

示例 1:

輸入:[[2]]
輸出:5

示例 2:

輸入:[[1,2],[3,4]]
輸出:17
解釋:
這裡有該形體在三個軸對齊平面上的三個投影(“陰影部分”)。

示例 3:

輸入:[[1,0],[0,2]]
輸出:8

示例 4:

輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:14

示例 5:

輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:21

提示:

  • 1 <= grid.length = grid[0].length <= 50
  • 0 <= grid[i][j] <= 50

解題思路:

本題和之前做過的【807. 保持城市天際線】 問題很相似,本題是找三檢視的面積,分別分成三個面來求解,

俯視:只要在網格位置上放置了立方體,向下投影的面積都是1,所以只需要區分有沒有網格上放置立方體。

前視:找到對應列立方體最高的投影面積和(即每列最大值之和)。

左視:與前視原理一致。找到對應行立方體最高的投影面積和(即每列最大值之和)。

AC程式碼:

class Solution {
public:
int projectionArea(vector<vector<int>>& grid) 
{
	//button 
	int btonNums = 0;
	for (int i = 0; i < grid.size(); i++)
	{
		for (int j = 0; j < grid[0].size(); j++)
		{
			if (grid[i][j]>0) btonNums++;
		}
	}

	//font
	int fontNums = 0;
	for (int i = 0; i < grid.size(); i++)
	{
		int Rmax = 0;
		for (int j = 0; j < grid[0].size(); j++)
		{
			if (grid[i][j]>Rmax) Rmax = grid[i][j];
		}
		fontNums += Rmax;
	}

	//left
	int  leftNums = 0;
	for (int j = 0; j < grid.size(); j++)
	{
		int Cmax = 0;
		for (int i = 0; i < grid[0].size(); i++)
		{
			if (grid[i][j]>Cmax) Cmax = grid[i][j];
		}
		leftNums += Cmax;
	}

	return btonNums + fontNums + leftNums;
}
};