题意:
给你一个有若干正方体构成都二维建筑,让你求出他的表面积
思路:
加法太复杂,可以用逆向思维——减法。
众所周知,一个正方体有六个面,我们可以先求出有几个正方体(设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;
}