Muscardinus

어른상어 본문

알고리즘 문제/[삼성 SW 역량 테스트 기출 문제]

어른상어

Muscardinus 2020. 9. 15. 11:00
728x90

www.acmicpc.net/problem/19237

 

19237번: 어른 상어

첫 줄에는 N, M, k가 주어진다. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) 그 다음 줄부터 N개의 줄에 걸쳐 격자의 모습이 주어진다. 0은 빈칸이고, 0이 아닌 수 x는 x번 상어가 들어있는 칸을 의미

www.acmicpc.net

#include <iostream>

using namespace std;

int n, m, k, ret;
int board[20][20][3]; // 위치 상어 번호 / 냄새의 상어 번호 / 냄새 강도
struct SHARK {
	int y, x, d;
	int priority[4][4];
};
SHARK shark[400];

int dy[] = { -1,1,0,0 };
int dx[] = { 0,0,-1,1 };

void solve() {
	int time = 0;
	int kill_shark = 0;
	while (time <= 1000) {
		time++;
		int new_board[20][20][3] = { 0, };
		for (int y = 0; y < n; y++) {
			for (int x = 0; x < n; x++) {
				new_board[y][x][0] = board[y][x][0];
				new_board[y][x][2] = board[y][x][2];
				if (new_board[y][x][2] > 0) { new_board[y][x][2]--; }
				if (new_board[y][x][2] > 0) { new_board[y][x][1] = board[y][x][1]; }
			}
		}
		for (int i = 0; i < m; i++) {
			int cy = shark[i].y;
			int cx = shark[i].x;
			int cd = shark[i].d;
			if (cy == -1) continue;
			bool is_move = false;
			for (int d = 0; d < 4; d++) {
				int nd = shark[i].priority[cd][d];
				int ny = cy + dy[nd];
				int nx = cx + dx[nd];
				if (ny < 0 || ny >= n || nx < 0 || nx >= n || board[ny][nx][2]) continue;
				is_move = true;
				new_board[cy][cx][0] = 0;
				if (new_board[ny][nx][0] == 0) {
					new_board[ny][nx][0] = i + 1;
					new_board[ny][nx][1] = i + 1;
					new_board[ny][nx][2] = k;
					shark[i].y = ny;
					shark[i].x = nx;
					shark[i].d = nd;
				}
				else {
					kill_shark++;
					shark[i].y = -1;
				}
				break;
			}
			if (is_move == false) {
				for (int d = 0; d < 4; d++) {
					int nd = shark[i].priority[cd][d];
					int ny = cy+dy[nd];
					int nx = cx+dx[nd];
					if (ny < 0 || ny >= n || nx < 0 || nx >= n) continue;
					if (board[ny][nx][2] && board[ny][nx][1] != i + 1) continue;
					new_board[cy][cx][0] = 0;
					if (new_board[ny][nx][0] == 0) {
						new_board[ny][nx][0] = i + 1;
						new_board[ny][nx][1] = i + 1;
						new_board[ny][nx][2] = k;
						shark[i].y = ny;
						shark[i].x = nx;
						shark[i].d = nd;
					}
					else {
						kill_shark++;
						shark[i].y = -1;
					}
					break;
				}
			}
		}
		if (kill_shark == m - 1) break;
		for (int y = 0; y < n; y++) {
			for (int x = 0; x < n; x++) {
				board[y][x][0] = new_board[y][x][0];
				board[y][x][1] = new_board[y][x][1];
				board[y][x][2] = new_board[y][x][2];
			}
		}
	}
	if (time <= 1000) ret = time;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin >> n >> m >> k;
	ret = -1;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			cin >> board[y][x][0];
			if (board[y][x][0]) {
				int shark_number = board[y][x][0] - 1;
				shark[shark_number].y = y;
				shark[shark_number].x = x;
				board[y][x][1] = board[y][x][0];
				board[y][x][2] = k;
			}
		}
	}
	for (int i = 0; i < m; i++) {
		cin >> shark[i].d;
		shark[i].d--;
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < 4; j++) {
			cin >> shark[i].priority[j][0] >> shark[i].priority[j][1] >> shark[i].priority[j][2] >> shark[i].priority[j][3];
			shark[i].priority[j][0]--;
			shark[i].priority[j][1]--;
			shark[i].priority[j][2]--;
			shark[i].priority[j][3]--;
		}
	}
	solve();
	cout << ret << "\n";
	return 0;
}
728x90

'알고리즘 문제 > [삼성 SW 역량 테스트 기출 문제]' 카테고리의 다른 글

스타트 택시  (0) 2020.09.19
큐빙  (0) 2020.09.16
청소년 상어  (0) 2020.09.11
주사위 윷놀이  (0) 2020.09.06
원판 돌리기  (0) 2020.09.05
Comments