상자 하도 쌓아서 상자문제는 조금 자신 있음ㅋㅋ
난 앞뒤양옆에서 봤을 때 개수를 더했는데 이 방법 말고 각 상자에 대해서 높이 차로 구하는 방법이 있었다
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define xx first
#define yy second
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
int main() {
int n, m;
scanf("%d %d", &n, &m);
vector<vector<int> > v(n, vector<int>(m));
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%d", &v[i][j]);
//앞
int front = 0;
for (int i = 0; i < m; i++)
{
front += v[n-1][i];
for (int j = n-2; j >= 0; j--)
{
if (v[j][i] - v[j+1][i] > 0)
{
front += v[j][i] - v[j+1][i];
}
}
}
//뒤
int back = 0;
for (int i = 0; i < m; i++)
{
back += v[0][i];
for (int j = 1; j < n; j++)
{
if (v[j][i] - v[j-1][i] > 0)
back += v[j][i] - v[j-1][i];
}
}
//왼
int left = 0;
for (int i = 0; i < n; i++)
{
left += v[i][0];
for (int j = 1; j < m; j++)
{
if (v[i][j] - v[i][j-1] > 0)
left += v[i][j] - v[i][j-1];
}
}
//오
int right = 0;
for (int i = 0; i <n; i++)
{
right += v[i][m-1];
for (int j = m-2; j >= 0; j--)
{
if (v[i][j] - v[i][j+1] > 0)
right += v[i][j] - v[i][j+1];
}
}
// printf("%d %d %d %d\n", front, back, left, right);
cout << front + back + left + right + 2*n*m;
return 0;
}
'UCPC' 카테고리의 다른 글
[20/05/24] E 제곱근 작도 (5389) (0) | 2020.05.30 |
---|---|
[20/05/24] D 차량 번호판 2 (16969) (0) | 2020.05.30 |
[20/05/24] J 피보나치 인버스 (10425) (0) | 2020.05.30 |
[20/05/24] I 팬케이크 쌓기(12744) (0) | 2020.05.30 |
[20/05/24] H 색칠공부(17092) (0) | 2020.05.30 |