https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4yLUiKDUoDFAUx
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
4중 벡터는 또 처음 써봅니다...
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Node {
int y;
int x;
int d;
int mem;
};
int R, C;
vector<vector<char>> map;
vector<vector<vector<vector<int>>>> visited;
int direct[4][2] = {
0, -1,
0, 1,
-1, 0,
1, 0,
};
int main() {
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++) {
int mem = 0;
map.clear();
visited.clear();
cin >> R >> C;
map.assign(R, vector<char>(C, ' '));
for (int i = 0; i < R; i++) {
string tmp;
cin >> tmp;
for (int j = 0; j < C; j++) {
map[i][j] = tmp[j];
}
}
int i = 0, j = 0, d = 0;
visited.assign(R, vector<vector<vector<int>>>(C, vector<vector<int>>(4, vector<int>(16, 0))));
queue <Node> q;
visited[0][0][1][mem] = 1;
q.push({ 0, 0, 1, mem });
bool isDone = false;
while (!q.empty()) {
Node now = q.front();
i = now.y;
j = now.x;
d = now.d;
mem = now.mem;
q.pop();
if (map[i][j] == '@') {
isDone = true;
break;
}
if (map[i][j] == '<') {
d = 0;
}
else if (map[i][j] == '>') {
d = 1;
}
else if (map[i][j] == '^') {
d = 2;
}
else if (map[i][j] == 'v') {
d = 3;
}
else if (map[i][j] == '_') {
if (mem == 0) d = 1;
else d = 0;
}
else if (map[i][j] == '|') {
if (mem == 0) d = 3;
else d = 2;
}
else if (map[i][j] >= '0' && map[i][j] <= '9') {
mem = map[i][j] - '0';
}
else if (map[i][j] == '+') {
if (mem >= 15) mem = 0;
else mem++;
}
else if (map[i][j] == '-') {
if (mem <= 0) mem = 15;
else mem--;
}
else if (map[i][j] == '?') {
// 이동 방향을 상하좌우 중 하나로 무작위로 바꾼다
for (int k = 0; k < 4; k++) {
int dy = (i + direct[k][0] + R) % R;
int dx = (j + direct[k][1] + C) % C;
if (visited[dy][dx][k][mem]) continue;
visited[dy][dx][k][mem] = 1;
q.push({ dy, dx, k, mem });
}
continue;
}
int dy = (i + direct[d][0] + R) % R;
int dx = (j + direct[d][1] + C) % C;
if (visited[dy][dx][d][mem]) continue;
visited[dy][dx][d][mem] = 1;
q.push({ dy, dx, d, mem });
}
cout << "#" << tc << " ";
if (isDone) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
'코딩 > SWEA' 카테고리의 다른 글
[SWEA] 2477. [모의 SW 역량테스트] 차량 정비소 C++ (0) | 2024.10.10 |
---|---|
[SWEA] 1486. 장훈이의 높은 선반 C++ (1) | 2024.10.09 |
[SWEA] D3. 7732. 시간 개념 C++ (0) | 2024.09.01 |
[SWEA] D3. 10912. 외로운 문자 C++ (0) | 2024.09.01 |