zoukankan      html  css  js  c++  java
  • 聪明的YZH

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

    聪明的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
    ",ans);
    37     return 0;
    38 }
    黎明的朝阳,会为苦难中最坚强的信念升起
  • 相关阅读:
    求X的N次乘方
    用辗转相除法求两个正整数的最大公约数
    求两、三个数中较大者的函数
    电文加密问题
    C#纯数学方法递归实现货币数字转换中文
    查找二维数组的查找之杨氏矩阵
    IT公司笔经面经
    排序2计数排序,桶排序
    windows Concurrency Runtimewindows的并行编程模型
    <c++ primer>第五部分 高级主题
  • 原文地址:https://www.cnblogs.com/Dawn-Star/p/9129669.html
Copyright © 2011-2022 走看看