【题目描述】(杨子恒大佬)

聪明YZH又开始搭积木了…… 他用1*1*1的立方体在n*m的平面搭积木,举几个他的杰作:

聪明的YZH-编程知识网

现在他又搭完了一个完美的杰作,他很好奇这对积木的表面积是多大 。

【输入格式】

第一行:正整数n和m 接下来n行每行m个字符 描述平面内这个位置上积木的个数(0<=每个位置上的积木个数<=9)。

【输出格式】

一个数: 这堆积木的表面积。

【分析】

我们遍历每一个方块,然后将当前的(i,j)方块和(i,j-1),(i,j+1),(i+1,j),(i-1,j)也就是四周的方块进行高度的比较,答案每次加上他们的高度差的绝对值,因为在内部的方块的每两个相邻的方块被算了两次,而边缘的都只算了一次,我们就先再加上边缘的方块的高度,在/2,在加上顶部和底部的方块面积就可以了。

【代码】

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 int n,m,s1;
 8 ll ans;
 9 int a[1010][1010];
10 
11 int idx(char c){return c-'0';}
12 
13 int main()
14 {
15     char c;
16     memset(a,0,sizeof(a));
17     s1=0;
18     scanf("%d%d",&n,&m);
19     c=getchar();
20     for(int i=1;i<=n;i++){
21         for(int j=1;j<=m;j++){
22             c=getchar();
23             a[i][j]=idx(c);
24             if(a[i][j]!=0)s1++;
25         }
26         c=getchar();
27     }
28     for(int i=1;i<=n;i++){
29         for(int j=1;j<=m;j++){
30             ans+=abs(a[i][j]-a[i+1][j])+abs(a[i][j]-a[i-1][j])+abs(a[i][j]-a[i][j+1])+abs(a[i][j]-a[i][j-1]);
31         }
32     }
33     for(int i=1;i<=n;i++)ans+=a[i][1]+a[i][m];
34     for(int i=1;i<=m;i++)ans+=a[1][i]+a[n][i];
35     ans=ans/2+s1*2;
36     printf("%lld\n",ans);
37     return 0;
38 }

 

转载于:https://www.cnblogs.com/Dawn-Star/p/9129669.html