题目大意:前面长篇大论屁用没有···, 地上有一堆摞起来的单位立方体, 高度不同, 现在要给堆起来的东西涂色, 只涂表面(遮挡不涂, 当然底面也不涂), 计算所有要涂的面的数量。
解题思路:数据不大,直接爆搜, 只要搜它四个方向, 高出来的就要涂侧面,否则只涂顶面(有的话)。
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, cnt;
int mp[55][55];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
void solve()
{
int xx, yy;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(mp[i][j] != 0) cnt++;
if(mp[i][j] > 0)
for(int k = 0; k<4; k++)
{
xx = i + dx[k];
yy = j + dy[k];
if(xx < 0 || yy < 0 || xx >= n || yy >= m) cnt += mp[i][j];
else if(mp[i][j] > mp[xx][yy]) cnt += mp[i][j] - mp[xx][yy];
}
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
cnt = 0;
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
scanf("%d", &mp[i][j]);
solve();
cout << cnt << endl;
}
return 0;
}