Giả sử có lưới N x N, ta đặt khối 1x1x1. Mỗi giá trị v = grid[i][j] là tháp v khối đặt trên ô (i,j). Ta tìm tổng diện tích bề mặt hình kết quả.
Ví dụ, [[1,2],[3,4]], đầu ra 34.
Giải quyết:
- Định nghĩa hàm adjacentArea(row)
- area := 0
- for i in range(len(row)-1), do
- if row[i] and row[i+1] khác 0, area += 2 * min(row[i], row[i+1])
- return area
- Từ main: z := 2 * (sum(sum(i>0 for i in row) for row in grid))
- x_plus_y := sum(sum(row) for row in grid) * 4
- x_adjacent := sum(adjacentArea(row) for row in grid)
- y_adjacent := sum(adjacentArea(row) for row in zip(*grid))
- return z + (x_plus_y - x_adjacent - y_adjacent)
Xem triển khai:
Ví dụ
class Solution:
def surfaceArea(self, grid):
def adjacentArea(row):
area = 0
for i in range(len(row) - 1):
if row[i] and row[i + 1]:
area += 2 * min(row[i], row[i+1])
return area
z = sum([sum(i > 0 for i in row) for row in grid]) * 2
x_plus_y = sum([sum(row) for row in grid]) * 4
x_adjacent = sum([adjacentArea(row) for row in grid])
y_adjacent = sum([adjacentArea(row) for row in zip(*grid)])
return z + (x_plus_y - x_adjacent - y_adjacent)
ob = Solution()
print(ob.surfaceArea([[1,2],[3,4]])) Đầu vào
[[1,2],[3,4]]
Đầu ra
34