这道题纯判断,先加上下,然后减前后左右,max(0,###)是用来防负数的
题目是这样的
题目描述
一座城市建立在规则的 n×m 网格上,并且网格均由 1×1 正方形构成。在每个网格上都可以有一个建筑,建筑由若干个 1×1×1 的立方体搭建而成(也就是所有建筑的底部都在同一平面上的)。几个典型的城市模型如下图所示:

现在给出每个网格上建筑的高度,即每个网格上建筑由多少个立方体搭建而成,要求这个建筑模型的表面积是多少。
输入格式
第 1 行包含 2 个正整数 n,m,为城市模型的长与宽。
接下来 n 行,每行 m 个数字字符,描述了网格每个格子高度(可见所有建筑高度都大于等于 0 且小于等于 9)。
输出格式
一个非负整数,为城市模型的表面积。
输入输出样例
输入 #
3 3 111 212 111
输出 #1
38
输入 #2
3 4 1000 0010 0000
输出 #2
12
说明/提示
- 20%的数据满足:n,m≤10;
- 40%的数据满足:n,m≤100;
- 100%的数据满足:1≤n,m≤1000。
以下是代码
#include <bits/stdc++.h>
using namespace std;
int n,m,a[1010][1010] = {0},z = 0;
string s;
int main(){
cin>>n>>m;
for(int i = 1;i <= n;i++){
cin>>s;
for(int j = 1;j <= m;j++){
a[i][j] = s[j - 1] - 48;
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(a[i][j] != 0){
z = z + 2 + max(0,a[i][j] - a[i - 1][j]) + max(0,a[i][j] - a[i][j - 1]) + max(0,a[i][j] - a[i + 1][j]) + max(0,a[i][j] - a[i][j + 1]);
}
}
}
cout<<z;
return 0;
}
点个赞吧!!!求求了!!!
733

被折叠的 条评论
为什么被折叠?



