題名:
複数の立方体で構成される2次元の建物を作成し、その表面積を見つけます
アイデア:
加算が複雑すぎるため、逆思考減算を使用できます。
ご存知のとおり、キューブには6つの面があります。まず、キューブの数を調べ(cとします)、次に6を掛けてすべての面を取得し、次に2つの部分を減算します。最初の部分は上下、2番目の部分は前後です。約。上下に各位置を解くことができ、各位置は2 * n-1です。ここで、nはこの位置の正方形の数です。
次に、2番目の部分は、この正方形の列の前、後ろ、左、および右です(この正方形の行にaがあると仮定します)。これは、彼の周りの4つの方向を比較して、彼より高い方向があるかどうかを確認します(bと仮定します)。カバーされているaがあり、それよりも短く、bがカバーされています。この列で4方向にカバーされている数値の合計を見つけ、すべてのポイントをトラバースして合計します。最後に6にcを掛けます-これら2つの部分の合計は
役に立ちません。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;
}