-
[SWEA 5648] 원자 소멸 시뮬레이션C 프로그래밍/SWEA 2022. 11. 17. 13:54728x90
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
#include <cstdio> #include <cstring> int T; int N; struct _st { int x, y; int dir; int k; bool alive; }Atom[1000 + 2]; int energy; int visited[4000 + 2][4000 + 2]; bool collision[4000 + 2][4000 + 2]; void init() { memset(Atom, 0, sizeof(Atom)); memset(visited, 0, sizeof(visited)); memset(collision, 0, sizeof(collision)); energy = 0; } void input() { scanf("%d", &N); for (int i = 1; i <= N; i++) { scanf("%d %d %d %d", &Atom[i].x, &Atom[i].y, &Atom[i].dir, &Atom[i].k); Atom[i].x += 1000; // 좌표값에 1000을 더해 음이 아닌 정수로 만들어준다. Atom[i].y += 1000; Atom[i].x *= 2; // 모든 원자들의 위치를 2배로 늘려 원자들이 정수값을 가지는 좌표에서 충돌이 나도록 할 수 있다. Atom[i].y *= 2; Atom[i].alive = true; visited[Atom[i].x][Atom[i].y] = 1; } } void move_atom() { for (int i = 1; i <= N; i++) { if (Atom[i].alive == false) continue; int x = Atom[i].x; int y = Atom[i].y; int dir = Atom[i].dir; visited[x][y] -= 1; int nx = x; int ny = y; if (dir == 0) ny++; else if (dir == 1) ny--; else if (dir == 2) nx--; else if (dir == 3) nx++; if (nx < 0 || nx > 4000 || ny < 0 || ny > 4000) { // 원자가 보드 밖을 벗어나면 어차피 충돌 못한다. Atom[i] = { -1, -1, -1, -1, false }; continue; } else { visited[nx][ny] += 1; Atom[i] = { nx, ny, dir, Atom[i].k, true }; if (visited[nx][ny] >= 2) collision[nx][ny] = true; } } } void is_collision() { for (int i = 1; i <= N; i++) { if (Atom[i].alive == false) continue; int x = Atom[i].x; int y = Atom[i].y; if (collision[x][y] == true) { if (visited[x][y] == 1) collision[x][y] = false; visited[x][y] -= 1; energy += Atom[i].k; Atom[i] = { -1, -1, -1, -1, false }; } } } bool chk_atom() { for (int i = 1; i <= N; i++) { if (Atom[i].alive == true) return false; } return true; } void simul() { while (1) { move_atom(); is_collision(); if (chk_atom()) return; } } int main() { scanf("%d", &T); for (int t = 1; t <= T; t++) { init(); input(); simul(); printf("#%d %d",t, energy); } return 0; }
728x90'C 프로그래밍 > SWEA' 카테고리의 다른 글
[SWEA 1210] Ladder1 (0) 2022.11.18 [SWEA 1249] 보급로 (0) 2022.11.17 [SWEA 1954] 달팽이 숫자 (0) 2022.11.17 [SWEA 2805] 농작물 수확하기 (0) 2022.11.17 [SWEA 1974] 스도쿠 검증 (0) 2022.11.17