<aside> 💡
엄청난 구현 문제
</aside>
c++의 enum 자료형을 통해 조금 더 가독성 좋게 구현해봤다.
#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
using namespace std;
typedef long long int ll;
enum WASD {W, A, S, D};
enum EVNT {DOWN, STAY, UP};
// 0:w, 1:a, 2:s, 3:d
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
int n, m;
int a[111][111];
int r = 0, c = 0;
int evnt[4];
int cmd[1'000'005];
void setEvnt(int idx)
{
string s;
cin >> s;
if(s == "Down") evnt[idx] = DOWN;
else if(s == "Stay") evnt[idx] = STAY;
else if(s == "Up") evnt[idx] = UP;
else assert(false);
}
signed main()
{
FASTIO;
cin >> n >> m;
vector<vector<int> > a(n+5, vector<int>(n+5, 1));
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++){
cin >>a[i][j];
if(a[i][j] == 2){
r = i;
c = j;
a[i][j] = 0;
}
}
}
setEvnt(W);
setEvnt(A);
setEvnt(S);
setEvnt(D);
for(int i = 1; i<=m; i++){
char cur; cin >> cur;
if(cur == 'W') cmd[i] = W;
else if(cur == 'A') cmd[i] = A;
else if(cur == 'S') cmd[i] = S;
else if(cur == 'D') cmd[i] = D;
else assert(false);
}
cmd[0] = -1;
cmd[m+1] = -1;
for(int i = 1; i<=m; i++){
bool isDown = false;
bool isStay = false;
bool isUp = false;
if(cmd[i] == cmd[i-1]){
isStay = true;
}
else{
isDown = true;
isUp = true;
}
for(int t = 0; t<4; t++){
int nr = r+dx[t];
int nc = c+dy[t];
if(cmd[i] == t){
if(evnt[t] == DOWN && isDown && !a[nr][nc]) { r = nr; c = nc; }
if(evnt[t] == STAY && isStay && !a[nr][nc]) { r = nr; c = nc; }
}
if(isUp && cmd[i-1] == t){
if(evnt[t] == UP && !a[nr][nc]) { r = nr; c = nc; }
}
}
}
cout << r << " " << c;
return 0;
}
문제 조건이 이해하는데에 조금 어려웠다.