洛谷 - P1187 3D模型

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,m10
  • 40 % 40\% 40%的数据满足: n , m ≤ 100 n, m \leq 100 n,m100
  • 100 % 100\% 100%的数据满足: 1 ≤ n , m ≤ 1000 1 \leq n, m \leq 1000 1n,m1000

不要从每一个方块的角度思考,而是看正面能求到多少面积,侧面能求多少面积,上方能求多少面积,然后乘二就行了。

代码:

#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;
}
  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值