https://www.acmicpc.net/problem/23031
구현 문제다.
문제 설명
1. 아리는 (1, 1)에서 시작한다. 나는 (0, 0)으로 시작했다.
2. 아리와 좀비는 모두 아래 방향을 보고 시작한다.
3. 아리의 이동경로가 문자열로 주어진다.
4. 아리는 벽에 부딪히면 이동하지 않는다.
5. 좀비는 벽에 부딪히면 방향을 바꾼다. -> 위아래로만 움직인다.
6. 아리는 스위치를 만나면 해당 칸과 주변 8칸 총 9칸을 영구적으로 밝힌다.
7. 아리의 이동이 끝난 후 좀비들이 이동한다.
7-1. 아리만 이동했을 때, 좀비까지 이동했을 때 두 경우에서 만나는 걸 고려해야 한다.
풀이
아리의 시작점과 방향, 스위치를 확인할 수 있는 입력 배열, 스위치가 켜졌는지 확인하는 불 배열, 좀비들의 좌표와 방향을 저장한 벡터를 이용해 문제를 풀었다.
입력을 받으면서 'Z'가 들어온 경우 벡터에 추가한다.
우선 아리를 이동한다. F인 경우 앞으로 움직이고 벽인 경우 가만히 있는다.
왼오 회전은 방향 인덱스를 이용해 4로 나눈 나머지를 구하는 작업을 했다.
F인 경우 스위치인지 확인하고 9방향 불을 키는 작업을 한다.
아리가 이동 후 좀비와 같은 칸에 있는지 확인한다.
이는 불이 꺼진 칸에 아리가 존재하는 경우에만 확인한다.
좀비는 벡터에 들어있기 때문에 벡터를 전체 순회하며 아리와 같은 칸에 존재하는지 확인한다.
그 후 좀비들을 이동시킨다.
좀비들의 수 만큼 반복을 통해 맨 앞 원소를 빼내고, 이동 시킨 후 벡터 맨 뒤에 넣는다.
좀비들을 모두 이동 시킨 뒤, 아리와 좀비가 같은 칸에 존재하는지 한 번 더 확인한다.
코드
#include <iostream>
#include <vector>
using namespace std;
struct zombie {
int r, c, d;
};
int n, sr, sc, sd;
char arr[15][15];
bool visit[15][15];
vector<zombie> zom;
int dr[9] = { 1, 0, -1 ,0, 1, 1, -1, -1, 0 };
int dc[9] = { 0, -1, 0, 1, 1, -1, 1, -1, 0 };
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
string s; cin >> s;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
if (arr[i][j] == 'Z') zom.push_back({i, j, 0});
}
int zize = zom.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'F') {
sr += dr[sd];
sc += dc[sd];
if (sr < 0 || sc < 0 || sr >= n || sc >= n) {
sr -= dr[sd];
sc -= dc[sd];
}
if (arr[sr][sc] == 'S') {
for (int k = 0; k < 9; k++) {
int r = sr + dr[k];
int c = sc + dc[k];
if (r < 0 || c < 0 || r >= n || c >= n) continue;
visit[r][c] = true;
}
}
}
else if (s[i] == 'R') sd = (sd + 1) % 4;
else sd = (sd - 1) % 4;
if (!visit[sr][sc]) {
for (int k = 0; k < zize; k++) {
if (sr == zom[k].r && sc == zom[k].c) {
cout << "Aaaaaah!";
return 0;
}
}
}
for (int k = 0; k < zize; k++) {
int r = zom[0].r;
int c = zom[0].c;
int d = zom[0].d;
zom.erase(zom.begin());
int rr = r + dr[d];
int cc = c + dc[d];
if (rr < 0 || cc < 0 || rr >= n || cc >= n) zom.push_back({ r, c, abs(d - 2) });
else zom.push_back({ rr, cc, d });
}
if (!visit[sr][sc]) {
for (int k = 0; k < zize; k++) {
if (sr == zom[k].r && sc == zom[k].c) {
cout << "Aaaaaah!";
return 0;
}
}
}
}
cout << "Phew...";
}
'Algorithm > Implementation' 카테고리의 다른 글
[C++] BOJ(백준) 1138 한 줄로 서기 (0) | 2024.06.22 |
---|---|
[C++] BOJ(백준) 14891 톱니바퀴 (1) | 2024.02.14 |
[C++] BOJ(백준) 4920 테트리스 게임 (1) | 2024.02.09 |
[C++] BOJ(백준) 17144 미세먼지 안녕! (1) | 2024.02.08 |
[C++] BOJ(백준) 3107 IPv6 (1) | 2024.02.06 |