3D模型
题目描述
一座城市建立在规则的 n × m n \times m n×m 网格上,并且网格均由 1 × 1 1 \times 1 1×1 正方形构成。在每个网格上都可以有一个建筑,建筑由若干个 1 × 1 × 1 1 \times 1 \times 1 1×1×1 的立方体搭建而成(也就是所有建筑的底部都在同一平面上的)。几个典型的城市模型如下图所示:
现在给出每个网格上建筑的高度,即每个网格上建筑由多少个立方体搭建而成,要求这个建筑模型的表面积是多少。
输入格式
第 1 1 1 行包含 2 2 2 个正整数 n , m n,m n,m,为城市模型的长与宽。
接下来 n n n 行,每行 m m m 个数字字符,描述了网格每个格子高度(可见所有建筑高度都大于等于 0 0 0 且小于等于 9 9 9)。
输出格式
一个非负整数,为城市模型的表面积。
样例 #1
样例输入 #1
3 3
111
212
111
样例输出 #1
38
样例 #2
样例输入 #2
3 4
1000
0010
0000
样例输出 #2
12
提示
- 20 % 20\% 20%的数据满足: n , m ≤ 10 n, m \leq 10 n,m≤10;
- 40 % 40\% 40%的数据满足: n , m ≤ 100 n, m \leq 100 n,m≤100;
- 100 % 100\% 100%的数据满足: 1 ≤ n , m ≤ 1000 1 \leq n, m \leq 1000 1≤n,m≤1000。
不要从每一个方块的角度思考,而是看正面能求到多少面积,侧面能求多少面积,上方能求多少面积,然后乘二就行了。
代码:
#include<iostream>
using namespace std;
const int N = 1010;int a[N][N];int main(){int n,m;cin >> n >> m;int ans = 0;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){char c;cin >> c;a[i][j] = c - '0';if(a[i][j] >= 1)ans++;}}for(int j = 1;j <= m;j++){ans += a[1][j];for(int i = 2;i <= n;i++){if(a[i][j] > a[i-1][j]){ans += (a[i][j] - a[i-1][j]);}}}for(int i = 1;i <= n;i++){ans += a[i][1];for(int j = 2;j <= m;j++){if(a[i][j] > a[i][j-1]){ans += a[i][j] - a[i][j-1];}}}cout << ans*2 << endl; return 0;
}