[백준/바킹독] 0310 시뮬레이션 3

OOING·2024년 3월 10일
0

백준+알고리즘 공부

목록 보기
60/75

오늘의 문제
3190 뱀
14500 테트로미노
13460 구슬 탈출 2 내일 재도전

3190 뱀

코드

#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)에 저장했다.

14500 테트로미노

코드

#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%에서 실패가 떴다.

13460 구슬 탈출 2

profile
HICE 19

0개의 댓글