2시간 정도 걸렸다.. 아 계속 디버그에서 시간을 너무 쏟는다.. 처음에 잘하자!!!
#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;
int n, m;
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int dy[8] = { 0,1,1,1,0,-1,-1,-1 };
struct Loc {
int m;
int s;
int d;
Loc(int a, int b, int c) {
m = a;
s = b;
d = c;
}
};
bool check(vector<Loc> nmap[][51], int i, int j) {
int L = nmap[i][j].size();
bool ok = true;
for (int k = 0; k < L; k++) { //모두 짝수인지 판별
if (nmap[i][j][k].d % 2 != 0) {
ok = false;
break;
}
}
if (ok) return true;
ok = true;
for (int k = 0; k < L; k++) {
if (nmap[i][j][k].d % 2 == 0) {
ok = false;
break;
}
}
if (ok) return true;
else return false;
}
pair<int, int> direction(int x, int y,int dir) {
int xx, yy;
xx = x + dx[dir];
yy = y + dy[dir];
if (xx > n) xx = 1;
else if (xx <= 0) xx = n;
if (yy > n) yy = 1;
else if (yy <= 0) yy = n;
return make_pair(xx, yy);
}
void move(vector<Loc> map[][51], vector<Loc> nmap[][51], int i, int j) {
int L = map[i][j].size();
for (int k = 0; k < L; k++) {
int tmp = map[i][j][k].s;
int dir = map[i][j][k].d;
int x = i;
int y = j;
while (tmp-- > 0) {
tie(x, y) = direction(x, y, dir);
}
nmap[x][y].push_back(map[i][j][k]);
}
}
void go(vector<Loc> map[][51], vector<Loc> nmap[][51], vector<Loc> nnmap[][51]) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j].size() >= 1)
{
move(map, nmap, i, j);
map[i][j].clear();
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (nmap[i][j].size() >= 2) {
int L = nmap[i][j].size();
int summ = 0;
int sumd = 0;
int sums = 0;
for (int k = 0; k < L; k++) {
summ += nmap[i][j][k].m;
sums += nmap[i][j][k].s;
}
summ = summ / 5;
sums = sums / L;
if (summ == 0) {
nmap[i][j].clear();
continue;
}
else {//nnmap에 넣어주기
int dir;
if (check(nmap,i,j)) dir = 2;
else dir = 1;
for (int k = 0; k < 4; k++) {
int ndir = 0;
if (dir == 2) ndir = dir * k;
else ndir = 2*dir * k + 1;
nnmap[i][j].push_back(Loc(summ, sums, ndir));
}
nmap[i][j].clear();
}
}
}
}
//이제야 nmap,nnamp을 map에 넣어주기!
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (nmap[i][j].size() >= 1) {
for (int k = 0; k < nmap[i][j].size(); k++) {
map[i][j].push_back(nmap[i][j][k]);
}
}
if (nnmap[i][j].size() >= 1) {
for (int k = 0; k < nnmap[i][j].size(); k++) {
map[i][j].push_back(nnmap[i][j][k]);
}
}
nmap[i][j].clear();
nnmap[i][j].clear();
}
}
}
int ans = 0;
int main() {
int l;
//freopen("in1.txt", "rt", stdin);
vector<Loc> map[51][51];
vector<Loc> nmap[51][51];
vector<Loc> nnmap[51][51];
cin >> n >> m >> l;
for (int i = 0; i < m; i++) {
int r, c,m, s, d;
cin >> r >>c>> m >> s >> d;
map[r][c].push_back(Loc(m, s, d));
}
for (int i = 0; i < l; i++) {
go(map,nmap,nnmap);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j].size() >= 1) {
for (int k = 0; k < map[i][j].size(); k++) {
ans += map[i][j][k].m;
}
}
}
}
cout << ans << '\n';
return 0;
}