친구들과 하는 하루 3문제 인증 기록용으로 다시 작성 시작
왜 시뮬레이션 2냐면 어제도 시뮬레이션 문제 풀었기 때문. 벨로그에 올리진 않았다.
#include <bits/stdc++.h>
using namespace std;
int board[12][6] = { }, tmp[12][6] = { };
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
bool check(int x, int y) {
return x >= 0 && x < 12 && y >= 0 && y < 6;
}
int puyo() {
int cnt = 0;
bool bomb = false;
while(1) {
for (int x = 0; x < 12; x++) {
for (int y = 0; y < 6; y++)
tmp[x][y] = board[x][y];
}
for (int j = 0; j < 6; j++) {
int i = 0;
while (i < 12) {
if (board[i][j] == 0) {
++i;
continue;
}
int now = board[i][j];
queue<pair<int, int>> q;
q.push({ i, j });
int same = 1;
tmp[i][j] = 0;
while (!q.empty()) {
int nowx = q.front().first;
int nowy = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
int nextx = nowx + dx[d];
int nexty = nowy + dy[d];
if (check(nextx, nexty) && tmp[nextx][nexty] == now) {
q.push({ nextx, nexty });
tmp[nextx][nexty] = 0;
++same;
}
}
}
if (same >= 4) {
bomb = 1;
for (int x = 0; x < 12; x++) {
for (int y = 0; y < 6; y++)
board[x][y] = tmp[x][y];
}
}
else {
for (int x = 0; x < 12; x++) {
for (int y = 0; y < 6; y++)
tmp[x][y] = board[x][y];
}
}
++i;
}
}
if (bomb) {
++cnt;
bomb = 0;
for (int c = 0; c < 6; c++) {
queue<int> tq;
for (int r = 0; r < 12; r++) {
if (tmp[r][c] != 0) tq.push(tmp[r][c]);
}
int idx = 0, qs = tq.size();
for (idx = 0; idx < qs; idx++) {
board[idx][c] = tq.front();
tq.pop();
}
for (; idx < 12; idx++) board[idx][c] = 0;
}
}
else break;
}
return cnt;
}
int main() {
for (int i = 11; i >= 0; i--) {
for (int j = 0; j < 6; j++) {
char c;
cin >> c;
if (c == 'R') board[i][j] = 1;
else if (c == 'G') board[i][j] = 2;
else if (c == 'B') board[i][j] = 3;
else if (c == 'P') board[i][j] = 4;
else if (c == 'Y') board[i][j] = 5;
}
}
cout << puyo();
}
'연쇄'를 잘못 이해하고 풀어서 실질적으로 구현하는 시간보다 수정하고 오류 잡는데 더 많은 시간을 썼다😕
#include <bits/stdc++.h>
using namespace std;
string gear[4];
void rotate(int k, int dir) {
string tmp = "";
if (dir == 1) {
tmp += gear[k][7];
for (int i = 0; i < 7; i++) tmp += gear[k][i];
}
else {
for (int i = 1; i < 8; i++) tmp += gear[k][i];
tmp += gear[k][0];
}
gear[k] = tmp;
}
int main() {
for (int i = 0; i < 4; i++) {
cin >> gear[i];
}
int n;
cin >> n;
while (n--) {
int num, dir;
cin >> num >> dir;
char gear_se[4][2];
for (int i = 0; i < 4; i++) {
gear_se[i][0] = gear[i][6]; // S
gear_se[i][1] = gear[i][2]; // E
}
rotate(num - 1, dir);
// 왼쪽 톱니바퀴들
bool turn = true; int now_dir = dir == 1 ? -1 : 1;
for (int i = num - 1; i > 0 && turn; i--) {
if (gear_se[i][0] != gear_se[i - 1][1]) {
rotate(i - 1, now_dir);
now_dir = now_dir == 1 ? -1 : 1;
}
else turn = false;
}
// 오른쪽 톱니바퀴들
turn = true; now_dir = dir == 1 ? -1 : 1;
for (int i = num - 1; i < 3 && turn; i++) {
if (gear_se[i][1] != gear_se[i + 1][0]) {
rotate(i + 1, now_dir);
now_dir = now_dir == 1 ? -1 : 1;
}
else turn = false;
}
}
int ans = 0;
for (int i = 0; i < 4; i++) ans += (gear[i][0] == '0' ? 0 : pow(2, i));
cout << ans;
}
메인 함수에서 구현하는 것보다 별도의 함수로 빼는걸 좋아하는데.. 이건 간단해서 그냥 메인에서 해결했다.
#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, k;
int board[20][20];
int dx[5] = { 0, 0, 0, -1, 1 };
int dy[5] = { 0, 1, -1, 0, 0 };
int dice[6] = { 0, 0, 0, 0, 0, 0 }; // 위, 북, 동, 서, 남, 바닥
void rotate(int dir) {
if (dir == 1) {
int tmp = dice[0];
dice[0] = dice[3];
dice[3] = dice[5];
dice[5] = dice[2];
dice[2] = tmp;
}
else if (dir == 2) {
int tmp = dice[0];
dice[0] = dice[2];
dice[2] = dice[5];
dice[5] = dice[3];
dice[3] = tmp;
}
else if (dir == 3) {
int tmp = dice[0];
dice[0] = dice[4];
dice[4] = dice[5];
dice[5] = dice[1];
dice[1] = tmp;
}
else {
int tmp = dice[0];
dice[0] = dice[1];
dice[1] = dice[5];
dice[5] = dice[4];
dice[4] = tmp;
}
}
bool check(int nowx, int nowy, int dir) {
int nextx = nowx + dx[dir];
int nexty = nowy + dy[dir];
return nextx >= 0 && nextx < n&& nexty >= 0 && nexty < m;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> x >> y >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> board[i][j];
}
}
for (int i = 0; i < k; i++) {
int dir;
cin >> dir;
if (check(x, y, dir)) {
x += dx[dir];
y += dy[dir];
rotate(dir);
if (board[x][y] == 0) board[x][y] = dice[5];
else {
dice[5] = board[x][y];
board[x][y] = 0;
}
cout << dice[0] << "\n";
}
}
}
주사위 굴리는 행위가 매우 헷갈렸다😣 배열로 나열했을 때 규칙이 있을 줄 알고 1차원, 2차원 배열 모두 생각하며 규칙을 찾으려고 했으나 실패.
결국 약간의 인터넷의 도움을 받아 직접 그림으로 그려서 좌표 변환을 해주는 방식을 선택.