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>
#include<cstdio>
using namespace std;
int map[1001][1001];
char input;
int ans_u,ans_f,ans_r,n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>input;
map[i][j]=input-'0';
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(map[i][j]>0) ans_u+=1;
}
for(int j=1;j<=m;j++){
ans_f+=map[1][j];
for(int i=2;i<=n;i++){
if(map[i][j]>map[i-1][j])
ans_f+=(map[i][j]-map[i-1][j]);
}
}
for(int i=1;i<=n;i++){
ans_f+=map[i][1];
for(int j=2;j<=m;j++){
if(map[i][j]>map[i][j-1])
ans_r+=(map[i][j]-map[i][j-1]);
}
}
cout<<(ans_u+ans_f+ans_r)*2;
return 0;
}