【题目描述】(杨子恒大佬)
聪明的YZH又开始搭积木了…… 他用1*1*1的立方体在n*m的平面搭积木,举几个他的杰作:
现在他又搭完了一个完美的杰作,他很好奇这对积木的表面积是多大 。
【输入格式】
第一行:正整数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