20056번 마법사 상어와 파이어볼

동도리동·2021년 10월 19일
0

코딩테스트

목록 보기
67/76

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;
}
profile
긍정코딩세상

0개의 댓글

관련 채용 정보