문제 : https://www.acmicpc.net/problem/17822
코드 :
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int N, M, T;
vector<int> temp[50];
set<std::pair<int, int>> index_t;
int mv[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
vector<std::pair<int, int>> valueInIndex;
void solution(int x, int d, int k)
{
//회전 횟수
for (int i = 0; i < k; i++)
{
int mul = 1;
while (true)
{
int n = x * mul;
if (n > N)
break;
//시계방향
if (d == 0)
{
int index = n - 1;
int t = temp[index][M - 1];
temp[index].pop_back();
temp[index].insert(temp[index].begin(), t);
}
else
{
int index = n - 1;
int t = temp[index].front();
temp[index].erase(temp[index].begin());
temp[index].push_back(t);
}
mul++;
}
}
float total = 0;
float count = 0;
index_t.clear();
valueInIndex.clear();
//인접 값 처리
for (int j = 0; j < N; j++)
{
for (int m = 0; m < M; m++)
{
for (int k = 0; k < 4; k++)
{
int my = j + mv[k][0];
int mx = m + mv[k][1];
if (my < 0 || my >= N)
continue;
if (mx < 0)
mx = M - 1;
if (mx >= M)
mx = 0;
if (temp[j][m] != 0 && temp[j][m] == temp[my][mx])
{
index_t.insert(std::pair<int, int>(j, m));
index_t.insert(std::pair<int, int>(my, mx));
}
}
total += temp[j][m];
if (temp[j][m] != 0)
{
valueInIndex.push_back(std::pair<int, int>(j, m));
count++;
}
}
}
//인접한 값이 없을 경우 평균값 처리
if (index_t.empty())
{
float v = total / count;
for (vector<std::pair<int, int>>::iterator iter = valueInIndex.begin(); iter != valueInIndex.end(); iter++)
{
if (temp[iter->first][iter->second] > v)
{
temp[iter->first][iter->second] -= 1;
}
else if (temp[iter->first][iter->second] < v)
{
temp[iter->first][iter->second] += 1;
}
}
}
else
{
for (set<std::pair<int, int>>::iterator iter = index_t.begin(); iter != index_t.end(); iter++)
{
temp[iter->first][iter->second] = 0;
}
}
}
int main()
{
cin >> N >> M >> T;
int v;
//값 입력
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> v;
temp[i].push_back(v);
}
}
//케이스별 계산
int x, d, k;
for (int i = 0; i < T; i++)
{
cin >> x >> d >> k;
solution(x, d, k);
}
//전체 합 계산
int result = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
result += temp[i][j];
}
}
cout << result << "\n";
return 0;
}
평균값 처리할때 값이 같을경우가 else문으로 들어오는 버그가 있었음...
부호 처리할땐 주의하자...ㅠㅠ
'algorithm > ACMICPC' 카테고리의 다른 글
주사위 윷놀이 - 17825 (0) | 2020.01.31 |
---|---|
로봇 청소기 - 14503 (0) | 2019.12.25 |
연구소 - 14502 (0) | 2019.12.25 |
N-Queen - 9663 (0) | 2019.12.23 |
테트로미노 - 14500 (Solve 2) (0) | 2019.12.14 |
댓글