오늘의 문제
3190 뱀
14500 테트로미노
13460 구슬 탈출 2내일 재도전
#include <bits/stdc++.h>
using namespace std;
int n, k, l, nowt = 0;
int board[102][102];
queue<pair<int, char>> q_move;
int dx[4] = { 0, 1, 0, -1 }; // 동 -> 남 -> 서 -> 북
int dy[4] = { 1, 0, -1, 0 };
bool check(int x, int y) { // true인 경우 게임 종료
return x < 0 || x >= n || y < 0 || y >= n || board[x][y] == 2;
}
void game() {
int nowx = 0, nowy = 0;
board[nowx][nowy] = 2;
queue<pair<int, int>> track;
track.push({ nowx, nowy });
int nextt = q_move.front().first;
char nextd = q_move.front().second;
q_move.pop();
int dir = 0;
while (1) {
if (nowt == nextt) {
if (nextd == 'L') dir = (dir + 3) % 4;
else dir = (dir + 1) % 4;
if (!q_move.empty()) {
nextt = q_move.front().first;
nextd = q_move.front().second;
q_move.pop();
}
}
nowx += dx[dir];
nowy += dy[dir];
if (check(nowx, nowy)) break;
track.push({ nowx, nowy });
if (board[nowx][nowy] == 1) {
board[nowx][nowy] = 2;
}
else {
board[nowx][nowy] = 2;
int tailx = track.front().first;
int taily = track.front().second;
track.pop();
board[tailx][taily] = 0;
}
++nowt;
}
}
int main() {
cin >> n >> k;
for (int i = 0; i < k; i++) {
int x, y;
cin >> x >> y;
board[x - 1][y - 1] = 1;
}
cin >> l;
for (int i = 0; i < l; i++) {
int t;
char c;
cin >> t >> c;
q_move.push({ t, c });
}
game();
cout << nowt + 1;
}
board[x][y]
가 0이면 빈 칸, 1이면 사과, 2이면 뱀의 몸을 의미한다.
뱀의 이동 자취를 queue(track
)에 저장했다.
#include <bits/stdc++.h>
using namespace std;
int n, m, max_sum = 0;
int board[502][502];
int tet_else[5][3][2] = {
{ {1, 0}, {1, 0}, {1, 1} },
{ {0, 1}, {0, 1}, {1, 1} },
{ {1, 0}, {1, 1}, {0, 1} },
{ {0, 1}, {1, 1}, {1, 0} },
{ {1, 0}, {1, 1}, {1, 0} } };
vector<vector<int>> tmp_tet;
void arrToV(int a, int r) {
if (a == 0) {
if (r == 0) tmp_tet = vector<vector<int>>(1, vector<int>(4, 1));
else tmp_tet = vector<vector<int>>(4, vector<int>(1, 1));
}
else if (a == 1) {
tmp_tet = vector<vector<int>>(2, vector<int>(2, 1));
}
else {
if (r % 2 == 0) tmp_tet = vector<vector<int>>(3, vector<int>(2, 0));
else tmp_tet = vector<vector<int>>(2, vector<int>(3, 0));
if (r == 0) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
tmp_tet[i][j] = tet_else[a - 2][i][j];
}
}
}
else if (r == 1) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
tmp_tet[i][j] = tet_else[a - 2][2 - j][i];
}
}
}
else if (r == 2) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
tmp_tet[i][j] = tet_else[a - 2][2 - i][1 - j];
}
}
}
else {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
tmp_tet[i][j] = tet_else[a - 2][j][1 - i];
}
}
}
}
}
void tet() {
for (int i = 0; i < 7; i++) { // 테트로미노 종류
for (int j = 0; j < 4; j++) { // 회전
arrToV(i, j);
if (n < tmp_tet.size() || m < tmp_tet[0].size()) continue;
for (int x = 0; x <= n - tmp_tet.size(); x++) {
for (int y = 0; y <= m - tmp_tet[0].size(); y++) {
int now = 0;
for (int a = 0; a < tmp_tet.size(); a++) {
for (int b = 0; b < tmp_tet[0].size(); b++) {
now += (tmp_tet[a][b] ? board[x + a][y + b] : 0);
}
}
max_sum = now > max_sum ? now : max_sum;
}
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> board[i][j];
}
}
tet();
cout << max_sum;
}
코드가 아주 황당하다.. 하고 보니 이럴거면 그냥 배열을 다 저장하는게 낫지 않았나..? 라는 생각이 들었다.
예시 그림이 5개만 나와있지만, 실제로는 테트로미노의 종류가 7개이다. 긴가민가하면서 5개로 돌렸더니 1%에서 실패가 떴다.