L - House Building 我的世界求建筑的表面积

题目链接

题意:

给你一个有若干正方体构成都二维建筑,让你求出他的表面积

思路:

加法太复杂,可以用逆向思维——减法。
众所周知,一个正方体有六个面,我们可以先求出有几个正方体(设c个),然后乘6,就是所有的面,然后减去两部分,第一部分是上下的,第二部分是前后左右。上下的我们可以对每个位置进行求解,每个位置都是2*n-1,n为这个位置的方块数。
然后第二部分就是这列方块的前后左右(假设这列方块有a个),就是比较他周围的四个方向,看看有没有比他高的(假设为b),如果有那这列方块就有a个被遮住了,然后比它矮,那就被遮住了b个,求这列四个方向被遮住的数目的和,然后遍历所有的点,求和。最后用6乘以c - 这两部分的和
多说无益,见AC码

#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

typedef long long ll;

int  a, b, n, m, c;
int k;
int tr[55][55];

int dx[4] = {
    
    -1, 1, 0, 0};
int dy[4] = {
    
    0, 0, -1, 1};

int judge(int x, int y)
{
    
    
    if(x <= 0 || y <= 0 || x > n || y > m)//就是这个地方,我写了个y < m 然后找了一晚上的错误!!!
        return 0;
    else
        return 1;
}

int sl(int x,int y)
{
    
    
    int sum = 0;
    for(int i = 0; i < 4; i++)
    {
    
    
        if(tr[x + dx[i]][y + dy[i]] >= tr[x][y] && judge(x + dx[i], y + dy[i]))
            sum += tr[x][y];
        else if(tr[x + dx[i]][y + dy[i]] < tr[x][y] && judge(x + dx[i], y + dy[i]))
            sum += tr[x + dx[i]][y + dy[i]];
        else if(judge(x + dx[i], y + dy[i]) == 0)
            sum += 0;
    }
    return sum;
}

int main()
{
    
    
    cin>>a;
    while(a--)
    {
    
    
        k = 0;
        b = 0;
        c = 0;
        cin>>n>>m;
        for(int i = 1; i <= n; i++)
        {
    
    
            for(int j = 1; j <= m; j++)
            {
    
    
                cin>>tr[i][j];
                b += tr[i][j];//求一共多少个小立方体
                if(tr[i][j] != 0)
                    k += 2 * tr[i][j] - 1;//求每个点上下面遮住了几个,加起来
            }
        }
        for(int i = 1; i <= n; i++)
        {
    
    
            for(int j = 1; j <= m; j++)
            {
    
    
                c+=sl(i, j);
            }
        }
        cout<<6 * b - k - c<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_51216553/article/details/110098101
今日推荐