Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 알고리즘
- 강의실2
- AI Hub
- 유니티
- 토글 그룹
- 우분투
- 18249
- 문자열 압축
- 윈도우
- 원형
- 영상 프레임 추출
- 마우스 따라다니기
- 수 만들기
- 회의실 배정
- c#
- 알고리즘 목차
- 자료구조 목차
- 3344
- mysqld.sock
- 그리디알고리즘
- 단어 수학
- 3273
- 탄막 이동
- 탄막 스킬 범위
- MySQL
- 탄막
- 백준
- 2020 KAKAO BLIND RECRUITMENT
- SWEA
- 걷는건귀찮아
Archives
- Today
- Total
와이유스토리
[시뮬레이션] 백준 19237 어른 상어 C++ 본문
※ 문제
https://www.acmicpc.net/problem/19237
※ 풀이
#include<bits/stdc++.h>
using namespace std;
struct Shark {
int num, x, y, curr, dir[5][5]; // 상어 번호, 위치, 현재 방향, 우선순위 방향
};
struct State {
int here, num, time; // 상어 번호, 냄새 남긴 상어 번호, 냄새 남은 시간
};
int n, m, k;
int dx[5] = { 0,0,0,-1,1 };
int dy[5] = { 0,-1,1,0,0 };
State board[22][22]; // 상어 번호, 냄새, 시간 기록
Shark sharks[401];
void move(int idx) {
Shark now = sharks[idx];
// 원래 있던 칸에 상어 없음 표시
board[now.y][now.x].here = 0;
// 냄새 없는 칸으로 이동
for (int j = 1; j <= 4; j++) {
int newX = now.x + dx[now.dir[now.curr][j]];
int newY = now.y + dy[now.dir[now.curr][j]];
if ((newX == 0) || (newY == 0) || (newX > n) || (newY > n)) continue;
if (board[newY][newX].num == 0) { // 냄새 없을 때
now.x = newX;
now.y = newY;
now.curr = now.dir[now.curr][j];
sharks[idx] = now;
return;
}
}
// 자신의 냄새 있는 칸으로 이동
for (int j = 1; j <= 4; j++) {
int newX = now.x + dx[now.dir[now.curr][j]];
int newY = now.y + dy[now.dir[now.curr][j]];
if ((newX == 0) || (newY == 0) || (newX > n) || (newY > n)) continue;
if (board[newY][newX].num == now.num) { // 자신의 냄새 있을 때
now.x = newX;
now.y = newY;
now.curr = now.dir[now.curr][j];
sharks[idx] = now;
return;
}
}
}
int check(int idx, int nmg) {
Shark later = sharks[idx];
// 큰 상어 번호 격자판 나가게
if ((board[later.y][later.x].here != 0) && (board[later.y][later.x].here < later.num)) {
sharks[idx].num = -1;
nmg--;
}
else {
board[later.y][later.x].here = later.num;
board[later.y][later.x].num = later.num;
board[later.y][later.x].time = k;
}
return nmg;
}
int start() {
int nmg = m;
int runTime = 0;
while (true) {
// 모든 상어 이동
for (int i = 1; i <= m; i++) { // 상어 번호
if (sharks[i].num == -1) continue; // 격자판 나간 상어 패스
move(i);
}
// 모든 상어 이동 후 격자판 업데이트(작은 번호부터 확인)
for (int i = 1; i <= m; i++) {
if (sharks[i].num == -1) continue; // 격자판 나간 상어 패스
nmg = check(i, nmg);
}
// 냄새 시간 흐르게
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (board[i][j].here) continue;
if (board[i][j].time) board[i][j].time--;
if (board[i][j].time == 0) board[i][j].num = 0;
}
}
runTime++;
if (nmg == 1) return runTime;
if (runTime >= 1000) return -1;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> k;
int temp;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> temp;
if (temp) {
sharks[temp] = { temp,j,i,0,{0,} };
board[i][j].here = temp;
board[i][j].num = temp;
board[i][j].time = k;
}
}
}
for (int i = 1; i <= m; i++) {
cin >> temp;
sharks[i].curr = temp; // 현재 방향
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= 4; j++) { // 해당 방향일 때
for (int k = 1; k <= 4; k++) { // 우선순위
cin >> temp;
sharks[i].dir[j][k] = temp;
}
}
}
cout << start();
}
'코딩테스트 > 시뮬레이션' 카테고리의 다른 글
[시뮬레이션] 프로그래머스 [1차] 프렌즈4블록 C++ (0) | 2022.03.03 |
---|---|
[시뮬레이션] 백준 20056 마법사 상어와 파이어볼 C++ (0) | 2022.02.08 |
[시뮬레이션] 백준 3954 Brainf**k 인터프리터 C++ (0) | 2022.02.05 |
[시뮬레이션] 백준 3190 뱀 C++ (0) | 2022.02.02 |
[시뮬레이션] 프로그래머스 키패드 누르기 C++ (0) | 2021.12.29 |
Comments