洛谷—— P1187 3D模型

https://www.luogu.org/problem/show?pid=1187

题目描述

一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成。在每个网格上都可以有一个建筑,建筑由若干个1×1×1的立方体搭建而成(也就是所有建筑的底部都在同一平面上的)。几个典型的城市模型如下图所示:

现在给出每个网格上建筑的高度,即每个网格上建筑由多少个立方体搭建而成,要求这个建筑模型的表面积是多少。

输入输出格式

输入格式:

 

输入文件的第1行包含2个正整数n和m,为城市模型的长与宽。

接下来n行,每行m个数字字符,描述了网格每个格子高度(可见所有建筑高度都大等于0且小等于9)。

 

输出格式:

 

输出文件包含一个非负整数,为城市模型的表面积。

 

输入输出样例

输入样例#1:
3 3
111
212
111

输出样例#1:
38
输入样例#2:
3 4
1000
0010
0000
输出样例#2:
12

说明

本题有2个测试数据

20%的数据满足:n, m≤10;

40%的数据满足:n, m≤100;

100%的数据满足:n, m≤1000。

 

模拟

 1 #include <cstdio>
 2 
 3 #define max(a,b) (a>b?a:b)
 4 inline void read(int &x)
 5 {
 6     x=0; register char ch=getchar();
 7     for(; ch>'9'||ch<'0'; ) ch=getchar();
 8     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
 9 }
10 const int N(1005);
11 char s[N][N];
12 int fx[4]={0,1,0,-1};
13 int fy[4]={1,0,-1,0};
14 int n,m,mat[N][N],H;
15 int if_[N][N],ans,cnt;
16 
17 int Presist()
18 {
19     read(n),read(m);
20     for(int i=1; i<=n; ++i) scanf("%s",s[i]+1);
21     for(int i=1; i<=n; ++i)
22       for(int j=1; j<=m; ++j)
23         mat[i][j]=s[i][j]-'0',H=max(H,mat[i][j]);
24     for(int h=1; h<=H; ++h)
25     {
26         for(int i=1; i<=n; ++i)
27          for(int j=1; j<=m; ++j)
28           if(mat[i][j]>=h)
29           {
30               ans+=6;
31               if(if_[i][j]==h-1&&h-1>0) cnt++;
32               if_[i][j]=h;
33             for(int k=0; k<4; ++k)
34             {
35                 int x=i+fx[k],y=j+fy[k];
36                 if(x<1||y<1||x>n||j>m) continue;
37                 if(mat[x][y]>=h) ans--;
38             }
39           }
40         ans-=cnt*2;cnt=0;
41     }
42     printf("%d\n",ans);
43     return 0;
44 }
45 
46 int Aptal=Presist();
47 int main(int argc,char*argv[]){;}

 

posted @ 2017-09-28 17:11  Aptal丶  阅读(501)  评论(0编辑  收藏  举报