728x90
해결과정 - 단순 구현
처음 문제를 본뒤 그냥 단순 구현이구나 라는 생각으로 주어진 대로 문제를 풀었다 하지만 테스트 케이스 중에 2번재 과정이 계속 틀려 곰곰히 생각하던 와중 1 과 N이 연결되있다는 것을 제대로 읽지 않고 N 이상으로 파이어 볼이 나가면 사라지도록 만들어서 틀렸던 것이였다
결과적으로는 그냥 단순 구현문제이면서 파이어볼이 이동할때 범위를 벋어나면 다시 원래 범위로 복귀 시켜주는 문제였다..
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<queue>
#define Fast ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
using namespace std;
typedef long long ll;
struct Ball {
int mass;
int speed;
int dir;
Ball(int mass, int speed, int dir) : mass(mass), speed(speed), dir(dir) {}
};
int dirX[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int dirY[8] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int n, m, k;
vector<vector<vector<Ball>>> board;
void MoveBall() {
vector<vector<vector<Ball>>> newBoard(n + 1, vector<vector<Ball>>(n + 1));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int size = board[i][j].size();
for (int k = size - 1; k >= 0; k--) {
int mass = board[i][j][k].mass;
int speed = board[i][j][k].speed;
int dir = board[i][j][k].dir;
board[i][j].pop_back();
int nx = j + dirX[dir] * speed;
int ny = i + dirY[dir] * speed;
if (nx < 1) nx = n - abs(nx) % n;
if (ny < 1) ny = n - abs(ny) % n;
if (nx > n) nx = nx % n;
if (ny > n) ny = ny % n;
if (nx == 0) nx = n;
if (ny == 0) ny = n;
newBoard[ny][nx].push_back(Ball(mass, speed, dir));
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k < newBoard[i][j].size(); k++) {
board[i][j].push_back(newBoard[i][j][k]);
}
}
}
}
void MergeBall() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (board[i][j].size() > 1) {
int totalMass = 0;
int totalSpeed = 0;
int odd = 0;
int even = 0;
int boardSize = board[i][j].size();
for (int k = boardSize - 1; k >= 0; k--) {
totalMass += board[i][j][k].mass;
totalSpeed += board[i][j][k].speed;
if (board[i][j][k].dir % 2 == 0) even++;
else odd++;
board[i][j].pop_back();
}
int newMass = totalMass / 5;
int newSpeed = totalSpeed / boardSize;
if (newMass == 0) continue;
if (even == boardSize || odd == boardSize) {
for (int k = 0; k < 4; k++) {
board[i][j].push_back(Ball(newMass, newSpeed, k * 2));
}
}
else {
for (int k = 0; k < 4; k++) {
board[i][j].push_back(Ball(newMass, newSpeed, k * 2 + 1));
}
}
}
}
}
}
int main() {
Fast;
cin >> n >> m >> k;
board.resize(n + 1);
for (int i = 0; i <= n; i++) {
board[i].resize(n + 1);
}
for (int i = 1; i <= m; i++) {
int y, x, mass, speed, dir;
cin >> y >> x >> mass >> speed >> dir;
board[y][x].push_back(Ball(mass, speed, dir));
}
for (int i = 0; i < k; i++) {
MoveBall();
MergeBall();
}
int answer = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k < board[i][j].size(); k++) {
answer += board[i][j][k].mass;
}
}
}
cout << answer << "\n";
return 0;
}
후기
쉬운문제라고 단순하게 보았다가 40분이나 걸려버렸다.. 문제를 잘읽자..
728x90
'알고리즘문제 풀어보기 > 백준' 카테고리의 다른 글
백준 - 2467 용액 (1) | 2024.10.07 |
---|---|
백준 2166 - 다각형의 넓이 (0) | 2024.10.07 |
백준 - 32462 Construct a coin set (1) | 2024.10.06 |
백준 - 32464 Grateful triangle (0) | 2024.10.06 |
백준 - 32394 4-cycle(easy) (0) | 2024.10.06 |